2016-04-17 9 views
-1

Ich erstelle ein riesiges Array von Permutationen mit Ersatz (Produkt) und es kostet so viel Zeit für die Berechnung. Lassen Sie uns einfache Funktion wie diese verwenden:Python itertools multiprocessing

def permutations(li): 
    return [p for p in itertools.product(li, repeat=20)] 

permutation(range(11)) 

Ich bin einfach nicht sicher, wie diese Funktion in mehrere Prozesse aufgeteilt (mit „Pool“ Klasse oder ähnliches). Ich habe in Python noch nie Multiprocessing benutzt und würde gerne um Hilfe bitten.

Irgendwelche Hinweise?

Danke!

+0

Haben Sie sich das Modul "Multiprocessing" (https://docs.python.org/2/library/multiprocessing.html) angesehen? – Cyb3rFly3r

+0

Das ist nicht so einfach. Sie müssen diesen Job in Teile aufteilen oder jeden Thread (oder Prozess) seine eigenen Permutationen generieren lassen. – ForceBru

+0

Vielleicht möchten Sie versuchen, 'cartesian' (' from sklearn.utils.extmath import cartesian'). Es wird Ihnen mehr Geschwindigkeit als zum Beispiel Multiprocessing auf 4 Kernen geben. – ptrj

Antwort

1

Zu groß geteilt durch 4 ist immer noch zu groß. Behalte unutbu's Kommentar: Es würde ewig dauern geteilt durch 4 mit Multiprocessing.

Allerdings ist hier ein funktionierendes Beispiel für nur 3 ** 2, vorausgesetzt, dass Sie etwas Nützliches in your_process tun:

import itertools 
import multiprocessing 

def your_process(perm): 
    # this is where you process each permutation 
    # currently it just prints the permutation. 
    print(perm) 

def permutations(li): 
    with multiprocessing.Pool(4) as workers: 
     workers.map(your_process, itertools.product(li, repeat=2)) 

permutations(range(3)) 

Aber wenn Sie wirklich> 11 haben **> 20 Permutationen, sollten mit etwas wie verteiltes Rechnen oder BOINC, oder vielleicht überdenken Sie Ihren Algorithmus.

+0

echo "Zu groß geteilt durch 4 ist immer noch zu groß." Genagelt – Mai