可以使用 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
这给出了一个错误:
回溯(最近一次通话最后):
文件“”,第 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 行,运行文件 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(function)
文件“C:\ProgramData\Anaconda2\lib\copy_reg.py”,第 70 行,在 _reduce_ex 中引发 TypeError,“can't pickle %s objects”% base。姓名
TypeError:无法腌制生成器对象
如何将 joblib 与这样的类一起使用?还是有更好的方法?