concurrent.futures.ProcessPoolExecutor.map()
は、2つ以上の引数からなる関数を呼びたいと思います。以下の例では、lambda
関数を使用し、同じ値を持つnumberlist
と等しいサイズの配列としてref
を定義しています。複数の引数を持つ関数をpython concurrent.futures.ProcessPoolExecutor.map()に渡すにはどうすればいいですか?
最初の質問:これを行うより良い方法はありますか? numberlistのサイズが数百万〜十億の要素になる可能性がある場合、refのサイズはnumberlistに従わなければならないので、このアプローチは不必要に貴重なメモリを消費します。これは、map
関数を読んで、最短配列の終わりに達するまでそのマッピングを終了させるためです。上記のコードを実行する
import concurrent.futures as cf
nmax = 10
numberlist = range(nmax)
ref = [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
workers = 3
def _findmatch(listnumber, ref):
print('def _findmatch(listnumber, ref):')
x=''
listnumber=str(listnumber)
ref = str(ref)
print('listnumber = {0} and ref = {1}'.format(listnumber, ref))
if ref in listnumber:
x = listnumber
print('x = {0}'.format(x))
return x
a = map(lambda x, y: _findmatch(x, y), numberlist, ref)
for n in a:
print(n)
if str(ref[0]) in n:
print('match')
with cf.ProcessPoolExecutor(max_workers=workers) as executor:
#for n in executor.map(_findmatch, numberlist):
for n in executor.map(lambda x, y: _findmatch(x, ref), numberlist, ref):
print(type(n))
print(n)
if str(ref[0]) in n:
print('match')
、私はmap
機能が私の望ましい結果を達成することができたことがわかりました。
Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/queues.py", line 241, in _feed
obj = ForkingPickler.dumps(obj)
File "/usr/lib/python3.5/multiprocessing/reduction.py", line 50, in dumps
cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function <lambda> at 0x7fd2a14db0d0>: attribute lookup <lambda> on __main__ failed
質問2:私はconcurrent.futures.ProcessPoolExecutor.map()に同じ条件を転送するときしかし、python3.5は、このエラーで失敗しましたなぜこのエラーが発生したとどのように私は、同時入手できますか.futures.ProcessPoolExecutor.map()は複数の引数を持つ関数を呼び出しますか?
あなたは ''ラムダ 'を実験することに頼っていました。なぜなら、 'ref'が定数だったとき、2つの引数を持つ関数を' executor'に渡すことに問題があったからです。 'ref'を' numberlist'と同じサイズのリストに変換した後、私はラムダを削除するのを忘れてしまいました。私が本当に欲しかったのは、 'ref'が定数であるか類似している解決策でした。したがって、あなたが言及したヘルパー関数&itertools.repeatは働きました。 –
私は、[ExecutorMap]のパフォーマンスを 'Executor.submit'でベンチマークした、私の[follow-up question](http://stackoverflow.com/q/42074501/5722359)にあなたを招待して前者はかなり遅く、私は理由を知りたいのですか? –