2014-02-05 14 views
2

我有一個python函數funz,每次返回一個不同的長度爲p的數組。 我需要不同的時間運行此函數,然後計算每個值的平均值。如何在一個類中並行化一個for python?

我可以用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 
+0

類是不完整的,但其他的功能應該是indipendent。 – Donbeo

回答

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): 
         ... 
    
+0

我使用了第一種方法,效果很好! – Donbeo

相關問題