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对象(例如调试打印)执行文章中未显示的操作
在Python 2中,
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你能详细说明一下吗?我刚开始学这个。你所说的“注意,它只能被迭代一次”是什么意思“…谢谢!