在不使用lambda函数的情况下,在多处理上应用多变量函数



我想应用形式的函数(实际函数有5个参数,但假设它只有2个(

def func(text,model):
return model[text]

以以下方式转换为数据帧:

model = something
df[col2]= df[col1].apply(lambda text: func(text, model)

这很好用,但很慢。除非函数是lambda函数,否则这是一个运行良好的快速版本。

def apply(func, data):
with Pool(cpu_count()) as pool:
return list(tqdm.tqdm(pool.imap(func, data), total=len(data)))

它抛出以下错误:

PicklingError: Can't pickle <function <lambda> at 0x7fe59c869e50>: attribute lookup <lambda> on __main__ failed

我的解决方案:为了更快地应用此函数,我使用了以下技巧:重新定义函数,使第二个参数为默认参数,并在加载函数之前定义值模型。

model = something
def func(text,model=model):
return model[text]

这很好,但我觉得这有点难看。我想知道是否还有其他方法可以做到这一点。我还尝试创建一个类

class Applyer:
def __init__(self,model):
self.model = model

def func(self,text):
return model[text]

如果我创建一个实例,然后应用这样的函数:

model=something
applyer = Applyer(model)
apply(applyer.func,df[col1])

这是有效的,但它甚至比使用普通的apply(没有多处理(还要慢。这是我的两次尝试。

您可以使用固定参数部分评估函数,然后使用functools.partial:使用缺少的变量参数调用它

from functools import partial
partial_func = partial(func, model=some_model)
# now you can call it directly, providing the missing parameter(s):
partial_func(some_text)
# and you can apply it without a lambda:
df[col1].apply(partial_func)

这应该已经加快了运行时间。我还没有尝试将其并行化,但由于这是一个简单的函数调用,所以这个问题中给出的方法也应该有效。

相关内容

  • 没有找到相关文章

最新更新