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 itertools模块练习

python 使用多处理模块通过多个进程执行功能的玩具示例。

《笔记》python itertools的groupby分组数据处理

3. 有点难~ Python函数式编程中 itertools 模块

itertools:处理可迭代对象的模块