如何并行化两个嵌套的for循环?

时间:2018-12-13 10:36:55

标签: python loops for-loop parallel-processing python-2.x

我想在Python 2.7中并行化两个嵌套的for循环,但是我自己没有成功。我不知道如何处理并行化的定义。

无论如何,这是单处理器代码:

import time

i = [int(x) for x in range(10000)]
j = [int(x) for x in range(10000, 20000)]

print len(i)
print len(j)

def sum(niz1,niz2):
    suma=[]
    for i in range(len(niz1)):
    suma1=0
        for j in range(len(niz2)):
            suma1=suma1+niz1[i]*niz2[j]
        suma.append(suma1)
    return suma

start_t0=time.time()
suma=sum(i, j)
print len(suma)

print ("Time:  %s seconds " % (time.time() - start_t0))

我想对第一个数组进行并行化。由于第二个循环中也需要此数组,因此如何执行呢?

简单的解释和代码示例将有很大的帮助。

2 个答案:

答案 0 :(得分:2)

一些想法:

  1. 我希望您的实际计算比您发布的计算更为复杂。如果不是,则只需计算一次niz2的总和,然后将niz1的每个元素乘以该总和即可得到结果向量。

  2. (假设实际用例更加复杂。)Python对于CPU限制的计算不是很快。处理大量数字时,应改用numpy之类的库。 Numpy的操作是用C语言实现的,因此比常规的python实现要快得多。

  3. (假设不选择numpy。)在Python中,有一个全局解释器锁(GIL),可确保(除了IO任务以外)一次仅一个线程处于活动状态。这意味着对于计算,使用多个线程不会缩短计算时间。实现真正的并行化的唯一方法是使用多个进程(import multiprocessing,但是在进程之间复制计算结果可能会成为瓶颈。

总而言之,请首先尝试优化单核执行。使用numpy已经可以解决80%的用例。仅在这些优化还不够的情况下才能并行化,并且不要期望由此带来的实质性改进。

有帮助吗?

答案 1 :(得分:0)

在Python中对大型值数组进行计算的第一步应该是在numpy中实现它。这样,您就可以利用numpy的向量化功能。使用以下脚本,我设法在大约15微秒内运行了相同的计算,而不是您的版本中的9秒(快了近1000000x)。

import numpy as np
i = np.arange(10000, dtype=np.int64)
j = np.arange(10000, 20000, dtype=np.int64)
suma = i * j.sum()

这可能不是您的真实计算,因此您应该考虑用例中该如何做。