2つの引数を取り、それらに対して計算を実行する関数があるとします。
def add(a, b):
return a + b
単一の引数を持つ関数のみを処理できるマルチプロセッシングライブラリを介してこの関数を呼び出したいと思います。そこで、代わりに引数を単一のタプルとして受け取るように関数を変更します。
def add2(ab):
a, b = ab
return a + b
しかし、これは私には不格好に思えます。変数は基本的に2回定義(および文書化)する必要があります。ラムダ関数を使用している場合は、次のように書くだけで、タプルを適切に受け入れることができます。
add3 = lambda (a, b): a + b
残念ながら、私の関数はラムダ関数として実装するのに十分なほど簡単ではありません。タプルを受け入れるが、そのタプルの各コンポーネントを個別の名前付き引数として扱う名前付き関数を記述できるようにする、Pythonの構文糖衣機能はありますか?これに対する解決策を検索しようとすると、ほとんどの場合、*args
演算子への参照が見つかりましたが、関数が呼び出されるサイトを制御していないため、ここでは当てはまりません。
これは、関数がどのように呼び出されるかの例です。マルチプロセッシングライブラリを介して呼び出されるため、複数の引数を渡すことはできません。
import multiprocessing
pool = multiprocessing.Pool(processes=4)
for result in pool.imap_unordered(add, [(1,2),(3,4)]):
print(result)
Python2.7または3.xのいずれかに対する回答を歓迎します。
元の関数インターフェイスを変更しないことをお勧めします。これにより、Pythonicが少なくなります。Python 2では、マルチプロセッシングで使用するラッパー関数を記述します。
def _add(args):
return add(*args)
Python 3では、Pool.starmap
代わりに次を使用してください。
>>> def add(a, b):
... return a + b
...
>>> p = Pool()
>>> list(p.starmap(add, [(1, 2), ('hello', ' world')]))
[3, 'hello world']
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加