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