27

Python では、multiprocessingモジュールを使用して、値の範囲で関数を並列に実行できます。たとえば、これは f の最初の 100000 回の評価のリストを生成します。

def f(i):
    return i * i

def main():
    import multiprocessing
    pool = multiprocessing.Pool(2)
    ans = pool.map(f, range(100000))

    return ans

f が複数の入力を取り、変数が 1 つしか変化しない場合、同様のことができますか? たとえば、これをどのように並列化しますか。

def f(i, n):
    return i * i + 2*n

def main():
    ans = []
    for i in range(100000):
        ans.append(f(i, 20))

    return ans
4

5 に答える 5

42

使用できますfunctools.partial()

def f(i, n):
    return i * i + 2*n

def main():
    import multiprocessing
    pool = multiprocessing.Pool(2)
    ans = pool.map(functools.partial(f, n=20), range(100000))

    return ans
于 2010-12-16T17:26:42.807 に答える
14

これを行うにはいくつかの方法があります。質問に示されている例では、ラッパー関数を定義するだけです

def g(i):
    return f(i, 20)

このラッパーを に渡しますmap()。より一般的なアプローチは、単一のタプル引数を取り、タプルを複数の引数にアンパックするラッパーを用意することです

def g(tup):
    return f(*tup)

または、同等のラムダ式を使用します: lambda tup: f(*tup).

于 2010-12-16T16:59:27.873 に答える
8

multiprocessingと呼ばれるの fork を使用するとpathos、複数の引数を取るプールを取得でき、lambda関数も取ることができます。これの良いところは、並列処理に適合するようにプログラミング構成を変更する必要がないことです。

>>> def f(i, n):
...   return i * i + 2*n
... 
>>> from itertools import repeat
>>> N = 10000
>>>
>>> from pathos.pools import ProcessPool as Pool
>>> pool = Pool()
>>>
>>> ans = pool.map(f, xrange(1000), repeat(20))
>>> ans[:10]
[40, 41, 44, 49, 56, 65, 76, 89, 104, 121]
>>>
>>> # this also works
>>> ans = pool.map(lambda x: f(x, 20), xrange(1000))
>>> ans[:10]
[40, 41, 44, 49, 56, 65, 76, 89, 104, 121]
于 2015-08-14T00:41:29.917 に答える
-3

あなたは貧乏人のカリー化を使うことができます(別名それを包む):

new_f = lambda x: f(x, 20)

次に、を呼び出しますnew_f(i)

于 2010-12-16T16:58:06.267 に答える