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 笔记本导致这个问题吗?
该答案仅在以下情况下有效
在 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到什么都没有。
要解决此问题,您有三个选择。
pool.starmap。Data在将其传递给 之前不要循环pool.starmap。Data = list(zip(NODE,PageRank,Destination)))。那么它就是一个可迭代对象,您可以根据需要多次迭代它。依我愚见,这个问题只是Python新手的一个成人仪式。如果它适用于您并且您想了解更多信息,您应该阅读迭代器和可迭代之间的差异,也许可以从这篇 SO post开始。
| 归档时间: |
|
| 查看次数: |
5533 次 |
| 最近记录: |