python多处理示例itertools多个列表

时间:2014-08-09 06:52:56

标签: python multithreading for-loop multiprocessing itertools

我有一个非常简单的应用程序,使用嵌套的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循环中的迭代次数很容易进入数百万(甚至更多)非常快速的事务中,因此作者建议不要这样做。

1 个答案:

答案 0 :(得分:3)

我建议将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]