これは、multiprocessing
モジュールを使用しているようです。あなたは言わなかった、そしてそれは重要な情報だ。
インスタンスの.map()
関数はmultiprocessing.Pool()
、関数とシーケンスの2つの引数を取ります。関数は、シーケンスからの連続した値で呼び出されます。
コードは複数の異なるプロセスで実行されるためdict
、(この例では引数)のようなミュータブルで値を収集することはできません。y
別のプロセスでに値を書き込んでも、dict
その値は元のプロセスに返されません。ただしPool.map()
、他のプロセスを使用すると、各関数呼び出しの結果が返され、最初のプロセスに戻ります。次に、値を収集してを作成できますdict
。
コード例:
import multiprocessing as mp
def f(x):
return (x, x*x)
if __name__ == '__main__':
pool = mp.Pool()
inputs = range(10)
result = dict(pool.map(f, inputs))
result
に設定されています:{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
x*x
計算する代わりにx
、ある程度の電力が発生し、電力が提供されるように変更しましょう。そして、文字列キー引数を取るようにしましょう。これはf()
、タプルがどこにある(key, x, p)
かを計算するタプル引数を取る必要があることを意味しますx**p
。
import multiprocessing as mp
def f(tup):
key, x, p = tup # unpack tuple into variables
return (key, x**p)
if __name__ == '__main__':
pool = mp.Pool()
inputs = range(10)
inputs = [("1**1", 1, 1), ("2**2", 2, 2), ("2**3", 2, 3), ("3**3", 3, 3)]
result = dict(pool.map(f, inputs))
複数のシーケンスがあり、それらを結合して上記の単一のシーケンスを作成する必要がある場合は、zip()
またはを使用することを検討してくださいitertools.product
。