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

2024-09-24 22:19:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想并行化python2.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))

我想对第一个数组进行并行化。既然在第二个循环中也需要这个数组,那么如何执行呢?你知道吗

简单的解释和代码示例会很有帮助。你知道吗


Tags: 代码inforlentimerangestartint
2条回答

一些想法:

  1. 我希望你真正的计算比你贴的要复杂。如果不是,只需计算一次niz2的和,然后将niz1的每个元素乘以该和就可以得到结果向量。

  2. (假设实际的用例更复杂)Python对于CPU受限的计算速度不快。在处理大量数字时,应该使用numpy之类的库。Numpy的操作是用C实现的,因此比常规的python实现快得多。

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

总之,首先尝试优化单核执行。使用numpy已经可以解决80%的用例。只有在这些优化还不够的情况下才进行并行化,不要期望从中得到实质性的改进。你知道吗

这有用吗?你知道吗

在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()

不过,这可能不是您真正的计算,所以您应该考虑在用例中如何做到这一点。你知道吗

相关问题 更多 >