我试图通过使用Python 2.7.6进行多处理来加速我的python代码。
以下' minimal'示例实际上有效 - (只要你有lmfit和parmap)。它的结构与我的实际代码非常相似。 我的问题在于我的真实代码' parmap.starmap,基本上是多个参数的map()(参见this和this post)失败,
cPickle.PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
有没有办法找出哪种方法可以腌制? 就像在示例中一样,我确保传递给parmap.starmap的函数是在模块的顶层定义的。它实际上是完全相同的功能。
调试我的真实&#39;代码,传递给starmap的函数在&f; func_globals&#39;下面有很多条目。我不知道这与它有什么关系,但我也不知道为什么有些条目存在。 所以我想我真正的问题是:如何通过导入其他模块或类来实现以下代码失败?我应该在实际代码中查找哪些内容以查看这是否是我的问题?
import numpy as np
from lmfit.models import GaussianModel
import parmap
def do_fitting(a_instance, y, x):
return a_instance.fit(x, y)
def gaussian(x, amp, cen, wid):
return amp * np.exp(-(x-cen)**2 /wid)
class A(object):
def __init__(self, model):
super(A, self).__init__()
self.model = model
def fit(self, x, y):
return self.model.fit(y, params=self.model.guess(y,x=x), x=x, verbose=False).result.params.valuesdict()
class B(object):
def __init__(self):
super(B,self).__init__()
self.gaussians = []
self.gmodels = {}
self.x = np.linspace(-10,10)
for n in range(400):
self.gmodels[n] = A(GaussianModel())
self.gaussians.append(gaussian(self.x, 2.33, 0.21, 1.51) + np.random.normal(0, 0.2, len(self.x)))
def do_fits_parallel(self):
results = parmap.starmap(do_fitting, zip(self.gmodels.itervalues(), self.gaussians), self.x)
return results
if __name__ == '__main__':
b = B()
print b.do_fits_parallel()