Python如何并行化循环

2024-09-28 23:30:31 发布

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

我对多线程和多处理非常陌生,并尝试使循环并行。我搜索了类似的问题,并基于multiprocessing模块创建了代码。在

import timeit, multiprocessing

start_time = timeit.default_timer()

d1 = dict( (i,tuple([i*0.1,i*0.2,i*0.3])) for i in range(500000) )
d2={}

def fun1(gn):
    for i in gn:
        x,y,z = d1[i]
        d2.update({i:((x+y+z)/3)})


if __name__ == '__main__':
    gen1 = [x for x in d1.keys()]
    fun1(gen1)
    #p= multiprocessing.Pool(3)
    #p.map(fun1,gen1)

    print('Script finished')
    stop_time = timeit.default_timer()
    print(stop_time - start_time)

在# 输出:

^{pr2}$

如果我更改代码如下:

#fun1(gen1)
p= multiprocessing.Pool(5)
p.map(fun1,gen1)

我有错误:

for i in gn:
TypeError: 'int' object is not iterable
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    raise self._value

有什么办法让这个平行吗?MATLAB有一个parfor选项来生成并行循环。我试图用这种方法使循环并行,但它不起作用。有什么办法让循环平行吗?另外,如果函数返回一个值怎么办?如果fun1()返回3个值,我可以写类似a,b,c=p.map(fun1,gen1)的代码吗?在

(在Windows python 3.6上运行)


Tags: 代码indefaultmapfortimemultiprocessingstart
2条回答

p.map为您执行循环,因此删除{}。在

也就是说,p.mapfun1应用于gen1的每个元素,因此gn就是其中一个元素。在

正如@Alex Hall所提到的,从fun1中删除迭代。另外,要等到泳池的所有工人都完成了。在

PEP8注意:import timeit, multiprocessing是一种不好的做法,请将其拆分为两行。在

import multiprocessing
import timeit


start_time = timeit.default_timer()

d1 = dict( (i,tuple([i*0.1,i*0.2,i*0.3])) for i in range(500000) )
d2 = {}

def fun1(gn):
    x,y,z = d1[gn]
    d2.update({gn: ((x+y+z)/3)})


if __name__ == '__main__':
    gen1 = [x for x in d1.keys()]

    # serial processing
    for gn in gen1:
        fun1(gn)

    # paralel processing
    p = multiprocessing.Pool(3)
    p.map(fun1, gen1)
    p.close()
    p.join()

    print('Script finished')
    stop_time = timeit.default_timer()
    print(stop_time - start_time)

相关问题 更多 >