我对多线程和多处理非常陌生,并尝试使循环并行。我搜索了类似的问题,并基于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上运行)
p.map
为您执行循环,因此删除{也就是说,
p.map
将fun1
应用于gen1
的每个元素,因此gn
就是其中一个元素。在正如@Alex Hall所提到的,从
fun1
中删除迭代。另外,要等到泳池的所有工人都完成了。在PEP8注意:
import timeit, multiprocessing
是一种不好的做法,请将其拆分为两行。在相关问题 更多 >
编程相关推荐