Jetzt bin ich über alles gestolpert( ... ). Wie aus diesem Programm hervorgeht, geben sie die entsprechende Ausgabe zurück:
Code: Select all
from random import randint
from math import prod
# create a array where each element has a 10% chance of being False, else True
l_bool=[randint(0,9)>0 for _ in range(10)]
# check if all elements are True
bool(prod(l_bool)),all(l_bool)
Aus der Dokumentation von all() geht hervor, dass es die Eingaben iteriert, bis ein False erkannt wird und wahrscheinlich für genau diese Aufgabe optimiert ist.
Allerdings würde ich davon ausgehen, dass prod() intern funktioniert gibt auch 0 zurück, sobald irgendetwas gefunden wird, und mein Verständnis von Iterables ist, dass es keinen großen Overhead erzeugen sollte, um das Zwischenergebnis der Multiplikation im Speicher zu halten.
Ich verstehe das alles( ) sollte hier verwendet werden, aber gibt es einen signifikanten Unterschied, den ich übersehe? Ich denke, ich muss es sein, da bool(prod( ... ) deutlich (~45 %) langsamer ist:
Code: Select all
import time
n=100_000
t0 = time.time()
for _ in range(n):
bool(prod(randint(0,9)>0 for _ in range(10)))
t_bool_prod=time.time()-t0
t1=time.time()
for _ in range(n):
all(randint(0,9)>0 for _ in range(10))
t_all=time.time()-t1
print(f"bool(prod( ... )) takes {round(100*((t_bool_prod/t_all)-1),2)}% longer!")