可以使用joblib在python中对函数进行多次调用 .
from joblib import Parallel, delayed
def normal(x):
print "Normal", x
return x**2
if __name__ == '__main__':
results = Parallel(n_jobs=2)(delayed(normal)(x) for x in range(20))
print results
给: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]
但是,我真正想要的是并行地在类实例列表上调用类函数 . 该函数只存储一个类变量 . 然后我会访问这个变量 .
from joblib import Parallel, delayed
class A(object):
def __init__(self, x):
self.x = x
def p(self):
self.y = self.x**2
if __name__ == '__main__':
runs = [A(x) for x in range(20)]
Parallel(n_jobs=4)(delayed(run.p() for run in runs))
for run in runs:
print run.y
这给出了一个错误:
Traceback(最近一次调用最后一次):文件“”,第1行,在runfile中('G:/ My Drive / CODE / stackoverflow / parallel_classfunc / parallel_classfunc.py',wdir ='G:/ My Drive / CODE / stackoverflow / parallel_classfunc')文件“C:\ ProgramData \ Anaconda2 \ lib \ site-packages \ spyder \ utils \ site \ sitecustomize.py”,第710行,在runfile execfile(文件名,命名空间)文件“C:\ ProgramData \ anaconda2 \ lib \ site-packages \ spyder \ utils \ site \ sitecustomize.py“,第86行,在execfile exec中(compile(scripttext,filename,'exec'),glob,loc)文件”G:/ My Drive / CODE / stackoverflow / parallel_classfunc / parallel_classfunc.py“,第12行,并行(n_jobs = 4)(延迟(run.p()运行中运行))文件”C:\ ProgramData \ Anaconda2 \ lib \ site-packages \ joblib \ parallel . py“,第183行,在延迟的pickle.dumps(函数)文件”C:\ ProgramData \ Anaconda2 \ lib \ copy_reg.py“,第70行,在_reduce_ex引发TypeError,”不能pickle%s对象“%base . name TypeError:无法pickle生成器对象
如何将joblib用于这样的类?还是有更好的方法?
1 回答
我们先提出一些代码抛光:
并非所有事情都符合
joblib.Parallel()( delayed() )
呼叫签名功能:所以,让我们让DEMO对象传递"through" aContainerFUN() :
StackOverflow_DEMO_joblib.Parallel.py :
结果?充当魅力!