Stimmt. Umgedreht ist meine Variante zwar immer noch schneller, aber nicht mehr ganz so deutlich.
Mehrfach ausgeführt hatte ich das sowieso immer.
Danke für den Tipp
Stimmt. Umgedreht ist meine Variante zwar immer noch schneller, aber nicht mehr ganz so deutlich.
Code: Alles auswählen
import sys
import asyncio
import socket
import time
TARGETS = [
('pymotw.com', 'https'),
('doughellmann.com', 'https'),
('python.org', 'https'),
('google.de', 'https'),
('stackoverflow.de', 'https'),
('beolingus.de', 'https'),
('leo.de', 'https'),
]
async def resolve_address(loop, address, protocol):
return await loop.getaddrinfo(
address, protocol,
proto=socket.IPPROTO_TCP,
)
event_loop = asyncio.get_event_loop()
async def main():
res = await asyncio.gather(*(resolve_address(event_loop, *t) for t in TARGETS))
print(res)
event_loop.run_until_complete(main())
Code: Alles auswählen
from multiprocessing import Pool
import socket
import time
def check_port(port: int) -> bool:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(3)
try:
s.connect(('hostname', int(port)))
s.shutdown(socket.SHUT_RDWR)
return port, True
except socket.timeout as ex:
return port, False
finally:
s.close()
if __name__ == '__main__':
start = time.perf_counter()
p = Pool(5)
print(p.map(check_port, [4839, 4840, 4841]))
end = time.perf_counter()
print('Duration: {}'.format(end - start))
Ja, bei so kleinen Spielzeuganwendungen ist es egal.
Wie ich bereits schreib, Spielzeuganwendungen kann man außer Acht lassen.Sirius3 hat geschrieben: ↑Dienstag 7. April 2020, 09:49 @DeaD_EyE: dagegen sprechen mehrere Gründe: hier im konkreten Fall, dass die Annotation schlicht falsch ist. Das passiert relativ häufig, dass sie die Signaturen von Funktionen während der Entwicklung ändern, und dann noch jedesmal die Annotation nachgezogen werden muß (und dann vergessen wird).
Wenn man es falsch macht, dann passiert das regelmäßig.Sirius3 hat geschrieben: ↑Dienstag 7. April 2020, 09:49 Zweitens sind die allermeisten Annotationen viel zu einschränkend. Dank Ducktyping läßt sich auch gar nicht die Gesamtheit aller möglichen Typen angeben. Sehr häufig schreibt man eine Funktion, die etwas berechnet, die man dann auch mit numpy-Arrays füttern kann, aber dank Annotation wird das als fetter Fehler angemerkt.
Code: Alles auswählen
MY_TYPE = Union[np.ndarray, typing.Sequence]
Deswegen benutzt man auch Docstrings und Code, der sich selbst erklärt.Sirius3 hat geschrieben: ↑Dienstag 7. April 2020, 09:49 Drittens: nur weil ich weiß, dass eine Funktion ein Argument eines bestimmten Typs erwartet, weiß ich noch lange nicht, welche semantische Bedeutung das Argument hat. Umgekehrt, wenn ich weiß, was ein Argument bedeutet, dann ist in 99% der Fälle auch klar, von welchem Typ dieses Argument sein muß. Gerade Anfängern verleitet das dazu, sich auf den Typ zu verlassen und totalen Murks zu programmieren, der formal richtig aussieht.
False Positives sind es nicht. Wenn du den Typen falsch oder nicht angibst, dann muss das auch angezeigt werden.Sirius3 hat geschrieben: ↑Dienstag 7. April 2020, 09:49 Ich persönlich mache fast nie einen Programmierfehler, der nur darin lag, dass ich den falschen Typ übergeben habe und falls doch, fällt das beim ersten Test auf.
Zusammengefasst, die Vorteile sind marginal, die Fehler, die man dabei macht, größer und der zusätzliche Aufwand meiner Meinung nach nicht zu gerechtfertigen. Und dann muß man noch all die false-postive Fehler, die bei einer Prüfung auffallen auch noch abschlalten.
Seit wann sind Docstrings für den Computer?
Python kennt das doctest Modul. Und wenn ich mich nicht völlig irre gab es das schon, bevor es die ganzen Unittest Module gab.Seit wann sind Docstrings für den Computer?