我想在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))
我想对第一个数组进行并行化。由于第二个循环中也需要此数组,因此如何执行呢?
简单的解释和代码示例将有很大的帮助。
答案 0 :(得分:2)
一些想法:
我希望您的实际计算比您发布的计算更为复杂。如果不是,则只需计算一次niz2
的总和,然后将niz1
的每个元素乘以该总和即可得到结果向量。
(假设实际用例更加复杂。)Python对于CPU限制的计算不是很快。处理大量数字时,应改用numpy
之类的库。 Numpy的操作是用C语言实现的,因此比常规的python实现要快得多。
(假设不选择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()
这可能不是您的真实计算,因此您应该考虑用例中该如何做。