Python多进程示例:itertools处理多个列表

1 投票
1 回答
1090 浏览
提问于 2025-04-18 16:38

我有一个非常简单的应用程序,里面有一个嵌套的循环,根据数据量的不同,运行时间可能从几分钟到几个小时不等。

我开始尝试使用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的多进程来实现这个呢?(是不是可以把任务分成几个部分?)或者说用Jug会更合适吗?根据StackOverflow上的建议,我花了几天时间尝试使用Jug,但由于我嵌套循环中的迭代次数很容易就达到几千万(甚至更多),而且这些操作非常快,所以作者建议我不要这样做。

1 个回答

3

我建议使用 itertools.product 配合多进程的映射功能:

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]

撰写回答