python多处理池.starmap不工作
我正在使用多处理python多处理池.starmap不工作,python,multiprocessing,pool,Python,Multiprocessing,Pool,我正在使用多处理pool.starmap函数。我发现了一个奇怪的问题 from multiprocessing import Pool p = multiprocessing.Pool() NODE = [1,2,3,4]; PageRank = [0.25,0.25,0.25,0.25]; Destination = [[2,3,4],[3,4],[1,4],[2]]; Data = zip(NODE,PageRank,Destination) 因此,我使用zip函数创建一个数据集dat
pool.starmap
函数。我发现了一个奇怪的问题
from multiprocessing import Pool
p = multiprocessing.Pool()
NODE = [1,2,3,4];
PageRank = [0.25,0.25,0.25,0.25];
Destination = [[2,3,4],[3,4],[1,4],[2]];
Data = zip(NODE,PageRank,Destination)
因此,我使用zip
函数创建一个数据集data
,它是一个列表,每个条目都是长度为3的元组。然后我调用这个函数
p.starmap(MyFunction, zip(NODE,PageRank,Destination))
它工作得很好
然而,当我打字时
p.starmap(MyFunction, Data))
它输出空列表[]
!!!!我真的不知道发生了什么事。实际上,我只是用数据
替换了zip(节点、PageRank、目的地)
,这应该是一样的,对吧
这是因为我使用的是Jupyter笔记本导致的吗?这个答案只有在以下情况下才有效
- 您正在使用Python 3,并且
- 您正在使用zip对象(例如调试打印)执行文章中未显示的操作
zip(…)
返回一个列表
;然而,在Python3中,它返回一个zip
对象(与您在文章中所说的列表不同)
zip对象是迭代器,因此只能迭代一次。到达迭代器的末尾后,再次对其进行迭代的任何尝试都不会产生任何结果。比如说,
>>> z = zip([1, 2], [3, 4])
>>> for x in z:
... x
...
(1, 3)
(2, 4)
>>> for x in z:
... x
...
>>> list(z)
[]
说到我的第二个要点,我怀疑您正在做一些看似无害的事情,比如在将数据作为参数传递给pool.starmap
之前打印数据的所有元素。如果是这种情况,那么您将耗尽迭代器,然后有效地告诉pool.starmap
将MyFunction
应用于绝对零
要解决此问题,您有三个选项
按照您提到的第一种方法,在调用pool.starmap
的过程中创建zip对象
在将数据传递到pool.starmap
之前,不要在其上循环
将zip对象强制转换为列表(Data=list(zip(节点、PageRank、目标))
)。然后它是一个iterable,您可以在它上迭代任意次数
以我的拙见,这个问题只是Python新手的一个成年仪式。如果它适用于您,并且您想了解更多信息,那么您应该仔细阅读迭代器和iterable之间的区别,也许可以从开始。当我实际编写执行这两行的Python脚本时,这两种方法对我都适用。确实如此,所以这可能是您在Jupyter中看到的问题的原因,但我不确定。这两个版本实际上对我来说都是Linux上的常规Python交互式解释器,只要我在脚本中定义MyFunction
,并导入它,而不是在解释器上定义它。如果您正在对zip对象执行其他操作,请注意,它只能迭代一次。如果当你在星图中使用它时,你已经在迭代器的末尾了,那么你应该看到一个空列表。啊,我认为@brentertainer可能是对的。@brentertainer你能详细说明一下吗?我刚开始学这个。你所说的“注意,它只能被迭代一次”是什么意思“…谢谢!