Il codice che è comune per entrambe le implementazioni:
from math import sqrt
def factors(x):
num = 2
sq = int(sqrt(x))
for i in range(2, sq):
if (x % i) == 0:
num += 2
return num + ((1 if sq == sqrt(x) else 2) if x % sq == 0 else 0)
1. attuazione che non fa uso di un generatore di funzioni:
i = 1
while True:
if factors(i * (i+1) * 0.5) > 500:
print(int(i * (i+1) * 0.5))
break
i += 1
2. Attuazione che fa uso di una funzione generatore :
def triangle():
i = 1
while True:
yield int(0.5 * i * (i + 1))
i += 1
t = triangle()
while True:
num = t.__next__()
if factors(num) > 500:
print(num)
break
la domanda:
La prima implementazione richiede circa 4 secondi mentre la seconda richiede circa 8,2 secondi. Perché c'è una grande differenza tra i tempi di esecuzione delle due implementazioni?Perché in questo caso si sta utilizzando una funzione di generatore due volte più veloce?
È importante che si tratti di una funzione di generatore, oppure si tratta solo di un altro caso in cui [il codice Python è più veloce quando lo si inserisce in una funzione] (http://stackoverflow.com/questions/11241523/why-does-python-code run-veloce-in-a-funzione)? – BrenBarn
* La prima implementazione richiede circa 4 secondi mentre la seconda impiega circa 8,2 secondi *, quindi il titolo del tuo post è corretto o l'ordine dei blocchi di codice è corretto? –
L'implementazione con il generatore è più veloce e richiede circa 4 secondi –