関数の実行を高速化するためにマルチプロセッシングを使用しようとしてpool.map
いますが、イテラブルはその関数の最初の引数ではありません。ピクル可能ではないため、ラムダは機能しません。functools.partial
を使用して新しい関数を作成しようとしましたが、 TypeError
. 以下は、同じ結果の非常に単純な例です。引数の順序を に切り替えると、f(i, s1, s2)
期待どおりに機能します。
ここで引数の順序が重要なのはなぜですか? 私がドキュメントを読んだとき、それは私には明らかではありません。
私のオプションは何ですか (元の機能を変更するという明らかな以外に)?
import multiprocessing
from functools import partial
def f(s1, s2, i):
return [s1] + [s2]*i
def main():
# other code... constants for f aren't known until runtime
pool = multiprocessing.Pool()
func = partial(f, s1='a', s2='c')
for strings in pool.map(func, range(10)):
print(strings)
pool.close()
pool.join()
if __name__ == '__main__':
main()
更新:私が考えることができる最善の方法は、モジュールレベルでラッパーを作成して引数の順序を切り替え、次にラッパーから部分的に切り替えることです。きれいに見えないか、まったくパイソンのように見えません。
import multiprocessing
from functools import partial
def f(s1, s2, i):
return [s1] + [s2]*i
def wrapper(i, s1, s2):
return f(s1, s2, i)
def main():
# other code... constants for f aren't known until runtime
pool = multiprocessing.Pool()
func = partial(wrapper, s1='foo', s2='bar')
for strings in pool.map(func, range(10)):
print(strings)
pool.close()
pool.join()
if __name__ == '__main__':
main()