python 多处理池.starmap 不起作用

Kev*_*Kim 2 python pool multiprocessing

我正在使用多处理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)
Run Code Online (Sandbox Code Playgroud)

所以我使用zip函数创建一个数据集Data,它是一个列表,每个条目都是长度为 3 的元组。然后我调用该函数

p.starmap(MyFunction, zip(NODE,PageRank,Destination))
Run Code Online (Sandbox Code Playgroud)

效果很好。

但是,当我输入

p.starmap(MyFunction, Data))
Run Code Online (Sandbox Code Playgroud)

它输出空列表[]!!!我真的不知道发生了什么事。我实际上只是替换zip(NODE,PageRank,Destination)Data,这应该是同一件事,对吧?

是因为我使用 Jupyter 笔记本导致这个问题吗?

bre*_*ner 5

该答案仅在以下情况下有效

  • 您正在使用 Python 3,并且
  • 您正在使用 zip 对象执行一些未出现在您的帖子中的操作(例如调试打印)

在 Python 2 中,zip(...)返回list; 然而在Python 3中,它返回一个zip对象(这与你在帖子中所说的列表不同)。

zip 对象是一个迭代器,因此只能迭代一次。到达迭代器末尾后,任何再次迭代它的尝试都不会产生任何结果。例如,

>>> z = zip([1, 2], [3, 4])
>>> for x in z:
...     x
... 
(1, 3)
(2, 4)
>>> for x in z:
...     x
... 
>>> list(z)
[]
Run Code Online (Sandbox Code Playgroud)

谈到我的第二个要点,我怀疑您正在做一些看似Data无害的事情,例如在将其作为参数传递给 之前打印所有元素pool.starmap。如果是这种情况,那么您将耗尽迭代器,然后有效地告诉pool.starmap应用MyFunction到什么都没有。

要解决此问题,您有三个选择。

  1. 按照您提到的第一种方式执行此操作,其中在调用 .zip 文件中创建 zip 对象pool.starmap
  2. Data在将其传递给 之前不要循环pool.starmap
  3. 将 zip 对象转换为列表 ( Data = list(zip(NODE,PageRank,Destination)))。那么它就是一个可迭代对象,您可以根据需要多次迭代它。

依我愚见,这个问题只是Python新手的一个成人仪式。如果它适用于您并且您想了解更多信息,您应该阅读迭代可迭代之间的差异,也许可以从这篇 SO post开始。