pathos.multiprocessing有starmap吗?

5

执行以下代码时出现错误。问题似乎是map不支持接受多个输入的函数,就像在Python内置的multiprocessing包中一样。但在内置包中,有一个starmap可以解决这个问题。那么pathos.multiprocessing有没有类似的功能呢?

import pathos.multiprocessing as mp


class Bar:
    def foo(self, name):
        return len(str(name))

    def boo(self, x, y, z):
        sum = self.foo(x)
        sum += self.foo(y)
        sum += self.foo(z)
        return sum


if __name__ == '__main__':
    b = Bar()
    pool = mp.ProcessingPool()
    results = pool.map(b.boo, [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])
    print(results)

类型错误:boo()缺少2个必需的位置参数:“y”和“z”

根据建议更新lambda表达式(未成功):

if __name__ == '__main__':
    b = Bar()
    pool = mp.ProcessingPool()
    results = pool.map(lambda x: b.boo(*x), [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])
    print(results)

Traceback (most recent call last):

File "C:\Users\yg451\Anaconda3\lib\site-packages\multiprocess\pool.py", line 121, in worker

result = (True, func(*args, **kwds))

File "C:\Users\yg451\Anaconda3\lib\site-packages\multiprocess\pool.py", line 44, in mapstar

return list(map(*args))

File "C:\Users\yg451\Anaconda3\lib\site-packages\pathos\helpers\mp_helper.py", line 15, in

func = lambda args: f(*args)

File "C:/Users/yg451/Code/foo/Machine Learning/xPype/test/scratch.py", line 18, in

results = pool.map(lambda x: b.boo(*x), [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])

NameError: name 'b' is not defined


为什么不让你的函数接受一个元组呢? - Mad Physicist
还是使用 lambda x: b.boo(*x) - Mad Physicist
嗯,大多数函数不是接受元组而是多个参数,让所有可能被并行化的函数都接受元组看起来有点丑陋。至于 lambda 表达式的解决方案,我尝试过 ...pool.map(lambda x: b.boo(*x), ...,但它没有起作用,似乎 Python 的 multipleprocessing 根本不支持 lambda 表达式。 - Indominus
它为什么不起作用?在内部,lambda函数和常规函数之间没有区别,所以我很难相信这一点。 - Mad Physicist
相信我,我相信你很难相信这一点,就像我曾经很难相信这一点一样(或者我只是做错了)。我会更新以展示我尝试过什么以及它为何不起作用。 - Indominus
那看起来像是作用域错误。权威的答案已经修复了它。 - Mad Physicist
1个回答

10
我是 pathos 的作者。 pathosstarmap 更早,而且并不真正需要它。它解决了一个池中的多个参数,就像内置的 map 一样。
>>> import pathos.multiprocessing as mp
>>> class Bar:
...     def foo(self, name):
...         return len(str(name))
...     def boo(self, x, y, z):
...         sum = self.foo(x)
...         sum += self.foo(y)
...         sum += self.foo(z)
...         return sum
... 
>>> b = Bar()
>>> pool = mp.ProcessingPool()
>>> f = lambda x: b.boo(*x)    
>>> results = pool.map(f, [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])
>>> results 
[6, 4, 5]
>>> results = pool.map(b.boo, [12, 9, 'a'], [3, 9, 'b'], [456, 10, 'cde'])
>>> results
[6, 4, 5]
>>> results = map(b.boo, [12, 9, 'a'], [3, 9, 'b'], [456, 10, 'cde'])
>>> list(results)
[6, 4, 5]
>>> 

因此,实际上 starmap 是不必要的。然而,由于它最近被添加到某些版本的Python标准multiprocessing中的Pool接口中,所以在pathos中它可能更加突出。请注意,如果需要,您已经可以从pathos获取"增强"版本的starmap

>>> import pathos
>>> mp = pathos.helpers.mp
>>> p = mp.Pool()
>>> p.starmap
<bound method Pool.starmap of <multiprocess.pool.Pool object at 0x1038684e0>>
>>> 

1
这样直接从权威口中得到信息真是太棒了 :) - Mad Physicist
谢谢您澄清了这一点!您能详细解释一下您提到的“增强型”starmap吗?我可能漏掉了什么,但这个p不仅是内置的multiprocessing.pool.Pool吗?为什么我不需要使用pathos来构建它呢? - Indominus
1
请注意,它是multiprocess而不是multiprocessing... 这表明Pool使用dill而不是pickle进行高级序列化。 - Mike McKerns
哦,我的错误!谢谢! - Indominus
当我尝试运行这段代码时,我得到了NameError: name 'b' is not defined的错误,出现在pool.map(f, [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])这一行。你有什么线索可以解释这个错误吗?(我使用的是Python 3.9) - undefined
我刚用Python3.9重新运行了这段代码,对我来说是有效的。请随意在GitHub上提交一个关于pathos的问题。你可以在那里提供更多信息,我们可以更容易地找出你为什么会看到错误。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接