Ecco un tentativo (leggermente disordinato) allo Project Euler Problem 49.Perché la deque di Pypy è così lenta?
Devo dire a priori che lo deque
non è stata una buona scelta! La mia idea era che ridurre il set di numeri primi per testare l'appartenenza avrebbe fatto accelerare il ciclo. Tuttavia, quando ho capito che avrei dovuto usare uno set
(e non mi preoccupo di rimuovere elementi), ho ottenuto un aumento di velocità 60x.
from collections import deque
from itertools import permutations
from .sieve import sieve_of_erastothenes # my own implementation of the Sieve of Erastothenes
primes = deque(prime for prime in sieve_of_erastothenes(10000) if prime > 1000 and prime != 1487) # all four-digit primes except 1487
try:
while True:
prime = primes.popleft() # decrease the length of primes each time to speed up membership test
for inc in xrange(1,10000 + 1 - (2 * prime)): # this limit ensures we don't end up with results > 10000
inc1 = prime + inc
inc2 = prime + 2*inc
if inc1 in primes and inc2 in primes:
primestr = str(prime)
perms = set(''.join(tup) for tup in permutations(primestr)) # because permutations() returns tuples
inc1str = str(inc1)
inc2str = str(inc2)
if inc1str in perms and inc2str in perms:
print primestr + inc1str + inc2str
raise IOError # I chose IOError because it's unlikely to be raised
# by anything else in the block. Exceptions are an easy
# way to break out of nested loops.
except IOError:
pass
In ogni caso, prima di pensare di usare un set
, ho provato in PyPy. Ho trovato i risultati siano piuttosto sorprendente:
$ time python "problem49-deque.py"
296962999629
real 1m3.429s
user 0m49.779s
sys 0m0.335s
$ time pypy-c "problem49-deque.py"
296962999629
real 5m52.736s
user 5m15.608s
sys 0m1.509s
Perché PyPy oltre cinque volte più lento su questo codice? Direi che la versione di Pypy dello deque
è il colpevole (perché corre più veloce nella versione set
), ma non ho idea del perché sia così.
Grazie per aver chiesto questo! Stavo per pubblicare una domanda che mi chiedeva perché la versione deque del mio codice fosse del 28% più lenta della versione list. –