6

Python で itertools.permutations 関数を使用して順列を生成しました。問題は、結果が非​​常に大きく、複数のスレッドでそれを実行したいのですが、それを達成する方法が本当にわからないということです:

perms = itertools.permutations('1234', r=4)

#I would like to iterate through 'perms' with multiple threads
for perm in perms:
    print perm
4

4 に答える 4

4

順列ジェネレーターからの項目で実行したい作業が CPU 集中型である場合は、おそらくスレッドではなくプロセスを使用することをお勧めします。CPython のグローバル インタープリター ロック (GIL) は、CPU にバインドされた作業を行う場合に限られた価値のマルチスレッドを作成します。

代わりに、次のようにmultiprocessingモジュールのPoolクラスを使用します。

import multiprocessing
import itertools

def do_stuff(perm):
    # whatever
    return list(reversed(perm))

if __name__ == "__main__":
    with multiprocessing.Pool() as pool: # default is optimal number of processes
        results = pool.map(do_stuff, itertools.permutations('1234', r=4))

        # do stuff with results

results(リストとして何かを行うのではなく) 繰り返し処理する場合は、ワーカー プロセスから生成された結果を処理するために使用できる反復子を取得する代わりに使用できることに注意してくださいimapmapアイテムが返される順序が問題にならない場合はimap_unordered、メモリを少し節約するために使用できます (と思います)。

if __name__ is "__main__"ボイラープレートは、モジュールが OS の制限を回避する必要がある Windows で必要です( multiprocessingno fork)。

于 2012-12-30T16:26:59.427 に答える
1

スレッド間でパーマの数のインデックスを分割し、この関数を使用して、すべてのパーマを生成してスレッド間で分割するのではなく、各スレッドのインデックスからパーマを生成します。

于 2013-01-01T18:24:08.043 に答える
1

処理関数が f(x) であると仮定すると、実行したい

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)   # start 4 worker processes
    perms = itertools.permutations('1234', r=4)
    for r in pool.map(f, perms):
        print (r)  

実際、スレッドを使用しても、IO バウンドでない限り、プロセスは並行して実行されません。CPU バウンドで、クアッド コアを使用している場合は、それが最適です。マルチコアがなく、CPU バウンドである場合、並列化しても現在の状況は改善されないのではないかと心配しています。

于 2012-12-30T16:23:28.370 に答える
0

Python のfuturesモジュールを使用すると、作業をスレッド間で簡単に分割できます。この例では、4 つのスレッドが使用されますが、必要に応じて変更できます。

from concurrent import futures

def thread_process(perm):
    #do something

with futures.ThreadPoolExecutor(max_workers=4) as executor:
    for perm in perms:
        executor.submit(thread_process, perm)
于 2012-12-30T16:22:47.557 に答える