Python any () + generator expression

Laut dem BlogbeitragHiersollte ein any () + generator-Ausdruck schneller als eine for-Schleife ausgeführt werden, und es scheint, als ob seine Argumentation Sinn macht.

Ich habe versucht, diese Methode zu verwenden (wenn auch für eine andere Funktion), aber die Ausführung scheint länger zu dauern als bei einer expliziten for-Schleife.

def with_loop(a, b):
    for x in xrange(1, b):
        if x * a % b == 1: return True
    return False

def with_generator(a, b):
    return any(x * a % b == 1 for x in xrange(1, b))

Grundsätzlich durchläuft der Code alle Zahlen von 1 bisb um herauszufinden, ob die nummera hat eine modulare Inverse.

Die Zeiten, die ich durch das Ausführen der Funktionen bekam, sind:

>>> from timeit import Timer as T
>>> T(lambda : with_generator(100, 300)).repeat(number = 100000)
[3.4041796334919923, 3.6303230626526215, 3.6714475531563266]
>>> T(lambda : with_loop(100, 300)).repeat(number = 100000)
[2.1977450660490376, 2.2083902291327604, 2.1905292602997406]
>>> T(lambda : with_generator(101, 300)).repeat(number = 100000)
[1.213779524696747, 1.2228346702509043, 1.2216941170634072]
>>> T(lambda : with_loop(101, 300)).repeat(number = 100000)
[0.7431202233722161, 0.7444361146951906, 0.7525384471628058]

with_generator (100,300) gibt False und with_generator (101,300) True zurück.

Es scheint, dass die Ausführung von with_generator immer länger dauert als die von with_loop. Gibt es einen Grund dafür?

BEARBEITEN: Gibt es eine andere kürzere oder elegantere Methode, um mit_loop eine ähnliche oder bessere Leistung zu erzielen? Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage