Quindi sono stato in giro con la lib di multiprocessing di python per gli ultimi giorni e mi piace molto il pool di elaborazione. È facile da implementare e posso visualizzare molti usi. Ho fatto un paio di progetti di cui ho sentito parlare prima di familiarizzarmi con esso e di recente ho terminato un programma che forza brutale giochi di boia.python prime crunching: il pool di elaborazione è più lento?
Chiunque stia eseguendo un compendio per l'esecuzione di tutti i numeri primi tra 1 milione e 2 milioni sia con thread singolo sia tramite un pool di elaborazione. Ora, per il croccante dell'impiccato, mettere i giochi in un pool di elaborazione ha migliorato il tempo di esecuzione di circa 8 volte (i7 con 8 core), ma quando si estraevano questi numeri primi, in realtà aumentava il tempo di elaborazione di quasi un fattore di 4.
Qualcuno può dirmi perché questo è? Ecco il codice per chiunque sia interessato a guardare o testarlo:
#!/user/bin/python.exe
import math
from multiprocessing import Pool
global primes
primes = []
def log(result):
global primes
if result:
primes.append(result[1])
def isPrime(n):
if n < 2:
return False
if n == 2:
return True, n
max = int(math.ceil(math.sqrt(n)))
i = 2
while i <= max:
if n % i == 0:
return False
i += 1
return True, n
def main():
global primes
#pool = Pool()
for i in range(1000000, 2000000):
#pool.apply_async(isPrime,(i,), callback = log)
temp = isPrime(i)
log(temp)
#pool.close()
#pool.join()
print sum(primes)
return
if __name__ == "__main__":
main()
Sarà attualmente gestito in un singolo thread, a correre attraverso il pool di trasformazione, rimuovere il commento le dichiarazioni piscina e commentare le altre linee del principale per ciclo.
In realtà qualcosa che accelera il tuo codice fino a un bel po 'è rimuovere le parti globali. Se hai delle variabili, la ricerca locale è molto più veloce. –
non è in grado di rimuovere le variabili globali senza aggiungere classi, in quanto posso solo passare una variabile alla funzione di callback. – Laharah
correlati: [Il modo più veloce per elencare tutti i numeri primi sotto N in python] (http://stackoverflow.com/q/2068372/4279) – jfs