如何在类中并行化python中的for?

时间:2014-02-05 17:22:26

标签: python parallel-processing multiprocessing pool

我有一个python函数funz,每次返回不同的长度为p的数组。 我需要不同时间运行此函数,然后计算每个值的平均值。

我可以使用for循环执行此操作,但这需要很多次。

我正在尝试使用库多处理,但是我遇到了错误。

import sklearn as sk
import numpy as np
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn import preprocessing,linear_model, cross_validation
from scipy import stats
from multiprocessing import Pool


class stabilize(BaseEstimator,TransformerMixin):

    def __init__(self,sim=3,n_folds=3):
        self.sim=sim
        self.n_folds=n_folds

    def fit(self,X,y):
        self.n,self.p=X.shape
        self.X=X
        self.y=y        
        self.beta=np.zeros(shape=(self.sim,self.p))
        self.alpha_min=[]        
        self.mapper=p.map(self.multiple_cv,[1]*self.sim)    

    def multiple_cv(self,o):
        kf=sk.cross_validation.KFold(self.n,n_folds=self.n_folds,shuffle=True)
        cv=sk.linear_model.LassoCV(cv=kf).fit(self.X,self.y)
        beta=cv.coef_
        alpha_min=cv.alpha_
        return alpha_min

我使用了一个虚拟变量o来告诉我想要使用多少并行进程。 这不是很优雅,可能是错误的一部分。 变量X和y已经是类的一部分,所以我没有参数传递给函数multiple_cv。

当我运行程序时,我收到此错误

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

1 个答案:

答案 0 :(得分:3)

您的问题是您要调用的函数是对象的实例方法。这不能序列化并发送到另一个进程。我看到两个解决方案:

  1. 使用不同的全局可用功能:

    class stabilize(BaseEstimator,TransformerMixin):
        ...
    def multiple_cv((self,o)):
        ...
    

        self.mapper=p.map(self.multiple_cv,[(self, 1)]*self.sim)
    
  2. 使用VeryPicklableObject及其依赖项使对象的方法可序列化。

        @picklableInstancemethod
        def multiple_cv(self, o):
            ...