2015-07-10 74 views
1

在下面的代碼一個具體的說法行事,我想multprocess sum_針對包括在np.array([1,2,3])z三個不同值:使pool.map內的函數,在其多個參數

from multiprocessing import Pool 
from functools import partial 
import numpy as np 

def sum_(x, y, z): 
    return x**1+y**2+z**3 

sum_partial = partial(sum_, x = 1, y = 2) # freeze x and y 
a = np.array([1,2,3]) # three different values for z 

p = Pool(4) 
p.map(sum_partial, a) 

p.map(sum_partial, a)給出了以下錯誤:TypeError: sum_() got multiple values for keyword argument 'x',因爲對於Python,我將a重新分配給我的函數的kwarg x。我怎樣才能使np.array([1,2,3])每個變量,以填補說法sum_代替xz,這樣我可以得到以下結果:

[6, 13, 32] 

分別是:

sum_partial(z=1), sum_partial(z=2), sum_partial(z=3) 

? 我想繼續使用pool.map

順便說一句,有可能使用多處理與數組yz數組最終得到len(y)*len(z)值的列表?

回答

0

我發現我的答案here

對我來說,這將是:

import multiprocessing as mp 

def sum_(x, y, z): 
    return x**1+y**2+z**3 

def mf_wrap(args): 
    return sum_(*args) 

p = mp.Pool(4) 

a = [1,2,3] 
b = [0.1,0.2,0.3] 
fl = [(1, i, j) for i in a for j in b] 
#mf_wrap = lambda args: myfun(*args) -> this sucker, though more pythonic and compact, won't work 

p.map(mf_wrap, fl) 
0

根據this threadPEP309,看來,你不能用partial替換函數的第一個,最左邊的參數。 因此,你應該稍微修改你的代碼,你的迭代z是第一個參數:

def sum_(z, x, y): 
    return x**1+y**2+z**3 

這對我的作品併產生期望的結果。

編輯: 關於你的第二個問題,你可以使用itertools生成的參數:

import itertools 
a = [1, 2, 3] 
b = [7, 8, 9] 
c = list(itertools.product(a, b)) 
print c 

Out[74]: [(1, 7), (1, 8), (1, 9), (2, 7), (2, 8), (2, 9), (3, 7), (3, 8), (3, 9)] 

在這種情況下,你的sum_應該期待一個元組作爲輸入:

def sum_(values, z): 
    x, y = values 
    return x**1+y**2+z**3 

sum_partial = partial(sum_, z=2) 
map(sum_partial, c) 

Out[88]: [58, 73, 90, 59, 74, 91, 60, 75, 92]