gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 16:39:21 26 4
gpt4 key购买 nike

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

我可以使用 for 循环来完成此操作,但需要花费很多时间。

我正在尝试使用库 multiprocessing 但我遇到了错误。

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. 使用不同的全局可用函数:

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

关于python - 如何在类中并行化 python 中的 for?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21584109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com