Estoy tratando de optimizar aún más la solución campeón en hilo número primo mediante la adopción de la fórmula compleja para la longitud de sub-lista. len() de la misma subsecuencia es demasiado lenta ya que len es costosa y generar la subsecuencia es costoso. Esto parece acelerar un poco la función, pero aún no pude quitar la división, aunque hago la división solo dentro de la declaración de condición. Por supuesto que podría tratar de simplificar el cálculo de la longitud mediante la suscripción de la optimización de partida marcado para n en lugar de n * n ...Mejorar puro Python tamiz prime por la fórmula de recurrencia
que sustituyen división/división entera por // para que sea compatible con Python 3 o
from __future__ import division
También me gustaría ser interesante si esta fórmula de recurrencia podría ayudar a acelerar la solución numpy, pero no tengo experiencia en usar numpy mucho.
Si habilita psyco para el código, la historia se vuelve completamente diferente, sin embargo, y el código tamiz de Atkins se vuelve más rápido que esta técnica especial de corte.
import cProfile
def rwh_primes1(n):
# http://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python/3035188#3035188
""" Returns a list of primes < n """
sieve = [True] * (n//2)
for i in xrange(3,int(n**0.5)+1,2):
if sieve[i//2]:
sieve[i*i//2::i] = [False] * ((n-i*i-1)//(2*i)+1)
return [2] + [2*i+1 for i in xrange(1,n/2) if sieve[i]]
def primes(n):
# http://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python/3035188#3035188
# recurrence formula for length by amount1 and amount2 Tony Veijalainen 2010
""" Returns a list of primes < n """
sieve = [True] * (n//2)
amount1 = n-10
amount2 = 6
for i in xrange(3,int(n**0.5)+1,2):
if sieve[i//2]:
## can you make recurrence formula for whole reciprocal?
sieve[i*i//2::i] = [False] * (amount1//amount2+1)
amount1-=4*i+4
amount2+=4
return [2] + [2*i+1 for i in xrange(1,n//2) if sieve[i]]
numprimes=1000000
print('Profiling')
cProfile.Profile.bias = 4e-6
for test in (rwh_primes1, primes):
cProfile.run("test(numprimes)")
Profiling (tanta diferencia no entre las versiones)
3 function calls in 0.191 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.006 0.006 0.191 0.191 <string>:1(<module>)
1 0.185 0.185 0.185 0.185 myprimes.py:3(rwh_primes1)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
3 function calls in 0.192 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.006 0.006 0.192 0.192 <string>:1(<module>)
1 0.186 0.186 0.186 0.186 myprimes.py:12(primes)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
Curiosamente aumentando el límite a 10 ** 8 y poniendo decorador de temporización a las funciones de eliminación de la elaboración de perfiles:
rwh_primes1 took 23.670 s
primes took 22.792 s
primesieve took 10.850 s
Curiosamente, si no se produce una lista de primos, sino que se devuelve el tamiz, el tiempo es aproximadamente la mitad de la versión de la lista de números.
acaba de ver su mejora de recurrencia hoy, nice ideia si tengo tiempo voy a buscar una variación de la misma, ¿viste el código para primes2? (Una versión pura pitón de mi solución más rápida numpy) http://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python/ –
Me encanta pitón, pero si desea mejorar la velocidad, vuelva a escribirla en C –
¿Ha perfilado su código? Yo sí, por favor publique los resultados. Si no, ¿cómo puedes saber qué optimizar? – 9000