最近写python程序,发现python的for循环太慢了,希望能通过多进程加速,加快程序速度。
程序功能:期望通过多进程把每一次循环的结果都保存在一个字典dict里,但是实际输出发现字典是空的,程序功能类似如下:
import multiprocessing
MP = {}
def putone(x):
a,b=x[0],x[1]
b[a]=2*a
MP[a] = 2*a
if __name__ == '__main__':
A=[1,2,3,4,5]
mp={}
B = [mp for i in range(len(A))]
cores = multiprocessing.cpu_count() // 2
pool = multiprocessing.Pool(cores)
pool.map(putone, zip(A,B))
pool.close()
pool.join()
print(mp)
print(MP)
但是打印出来的dict都是空的。
{}
{}
我对其进行很多次尝试,最后发现一方面希望多进程加速for循环,一方面希望公有变量MP保存每一次for循环的结果输出,是矛盾的。因为开起了多进程,每个进程拥有独立的地址空间,变量空间,也就是说在上面程序中每个进程都会维护一个独立的MP变量,所以最后打印出来的MP结果是空的。而同一进程的多个线程是共享变量空间的,所以上述程序采用多线程执行较好。
反思:在学习操作系统的时候,我能很清楚地认识到不同进程拥有独立的地址空间,但是一写程序就犯了这样的错误,理论需要实践的学习才能深入人心。
解决方法:
1.多线程
2. 使用 multiprocessing.Manager() 共享变量
参考链接:Python 进程之间共享数据
import multiprocessing
MP = multiprocessing.Manager().dict()
def putone(x):
a,b=x[0],x[1]
b[a]=2*a
MP[a] = 2*a
if __name__ == '__main__':
A=[1,2,3,4,5]
mp=multiprocessing.Manager().dict()
B = [mp for i in range(len(A))]
cores = multiprocessing.cpu_count() // 2
pool = multiprocessing.Pool(cores)
pool.map(putone, zip(A,B))
pool.close()
pool.join()
print(mp)
print(MP)
输出结果:
{1: 2, 3: 6, 5: 10, 2: 4, 4: 8}
{1: 2, 5: 10, 2: 4, 3: 6, 4: 8}