gpt4 book ai didi

python 多处理池.starmap 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 20:33:42 26 4
gpt4 key购买 nike

我正在使用多处理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(NODE,PageRank,Destination) 替换为 Data,这应该是同一件事,对吧?

这是因为我使用 Jupyter 笔记本导致的吗?

最佳答案

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

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

在 Python 2 中,zip(...) 返回一个列表;然而在 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)
[]

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

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

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

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

关于python 多处理池.starmap 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57310809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com