Python多进程示例:itertools处理多个列表
我有一个非常简单的应用程序,里面有一个嵌套的循环,根据数据量的不同,运行时间可能从几分钟到几个小时不等。
我开始尝试使用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]