python 多处理示例 itertools 多个列表
Posted
技术标签:
【中文标题】python 多处理示例 itertools 多个列表【英文标题】:python multiprocessing example itertools multiple lists 【发布时间】:2014-08-09 06:52:55 【问题描述】:我有一个带有嵌套 for 循环的非常简单的应用程序,运行可能需要几分钟到几小时,具体取决于数据量。
我开始使用 python 中的多处理库。我尝试以最基本的形式实现它,即使我的代码运行,也没有性能提升。让我相信我执行不正确和/或我的代码设计存在极大缺陷。
我的代码非常简单:
import csv
import multiprocessing
somedata1 = open('data1.csv', 'r')
SD_data = csv.reader(data1,delimiter=',')
data1 = []
**import lots of CSV data***
def crunchnumbers():
for i, vald1 in enumerate(data1):
for i, vald2 in enumerate(data2):
for i, vald3 in enumerate(data3):
for i, vald4 in enumerate(data3):
for i, vald5 in enumerate(data3):
sol = #add values
print d_solution
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
pool.apply(crunchnumbers)
如何使用 python 的多处理来做到这一点? (不知何故分成几块?)或者这对水罐来说是更好的工作吗?根据关于 SO 的建议,我花了几天时间尝试使用 Jug,但我的嵌套 for 循环中的迭代次数很容易进入数百万(甚至更多)非常快速的事务,因此作者建议不要这样做。
【问题讨论】:
您没有提供足够的信息:“某些标准”的依赖关系是什么?它是否取决于“vlad”之一?一世 ?两个都 ?全部 ?如果我们有这些信息,我们也许可以创建一个递归函数,聚合中间结果并使用“rest”递归调用 @alfasin 我提供了条件逻辑。我会研究你的建议。谢谢 【参考方案1】:我建议将 itertools.product
与 multiprocessing-map 一起使用:
import csv
import multiprocessing
from itertools import product
def crunchnumber(values):
if some criteria:
sol = values[0][2]+values[1][2]+values[2][2]....
return sol
def process(datas):
"takes data1, ..., datan as a list"
pool = multiprocessing.Pool(processes=4)
result = pool.map_async(crunchnumber, product(*datas))
print [a for a in result if a is not None]
【讨论】:
我会深入研究 itertools.product 啊,很酷,看起来我需要使用 product() 代替我的前 2 个循环和 combine() 代替我的最后 3 个循环。 我不确定我通过 product(*datas) 传递了什么以及最初传递到 process(datas) 的是什么?我用 process() 调用吗? csv数据究竟是如何传递的?我更了解多进程如何与 map 一起工作,以及 product() 是如何工作的,但如果你能扩展一下,我想我已经接近了可以建立的基础。 @nodoze:通常是设计错误,有编号的变量名称。所以正确的做法是把data1
,data2
,...放到一个列表datas = [data1, data2, ...]
中。以上是关于python 多处理示例 itertools 多个列表的主要内容,如果未能解决你的问题,请参考以下文章
具有多处理功能的 Python itertools - 巨大的列表与使用迭代器的 CPU 使用效率低下
python 使用多处理模块通过多个进程执行功能的玩具示例。
《笔记》python itertools的groupby分组数据处理