Python 中并行编程的意外输出:我做得对吗?
Unexpected output from parallel programming in Python: am I doing it correctly?
我正在尝试在 Python 中学习并行编程。作为起点,我决定编写一个程序来测试 multiprocessing
模块,然后再转到 'multiprocess' 模块(据我所知,不同之处在于 运行ge 可序列化对象在 'multiprocess' 模块中更大,因为它使用 dill
而不是 pickle
)。
该程序的目的是测量使用 1 到 7 个进程对 range(1000)
中的数字求平方根所需的时间。我将这个程序循环了 80 次并生成了下图。
关于这个我有几个问题。
- 我是否正确实现了并行化?根据此数据,似乎更多的进程并不等于更少的时间。
- 为什么标准偏差这么大?
=========编辑======
问题 3 已回答
- 我 运行 这个程序两次,两次我的电脑(32Gb 内存、i7 处理器和 8 核)都崩溃了。为什么会这样?
此外,如果有人对 Python 中的并行编程有任何进一步的提示,我们将不胜感激。
干杯。
我用来生成数据的代码:
from multiprocessing import Pool
import numpy
import time
import pandas
import os
import matplotlib.pyplot as plt
import numpy
def sqrt(x):
return numpy.sqrt(x)
num_repeats=100
num_processors=8
if __name__ == '__main__':
for i in range(num_repeats):
t=[]
print 'repeat {}'.format(i)
for j in range(num_processors):
if j!=0:
pool = Pool(j)
start=time.time()
results = [pool.apply_async(sqrt, (x,))for x in range(1000)]
t.append( time.time()-start)
df=pandas.DataFrame(pandas.Series(t))
df= df.transpose()
df.columns=['processor {}'.format(i) for i in range(num_processors-1)]
df.to_csv( os.path.join( os.getcwd(),'parallel_p_test.csv') ,mode='a',header=True)
对于非常快速完成的操作,您会发现并行化不会带来太多好处,因为您将花费大量时间来处理进程同步的开销。
我建议用几秒钟的时间重试。
如果您的计算机崩溃了,那说明有严重问题。什么OS?日志中有什么吗?
我正在尝试在 Python 中学习并行编程。作为起点,我决定编写一个程序来测试 multiprocessing
模块,然后再转到 'multiprocess' 模块(据我所知,不同之处在于 运行ge 可序列化对象在 'multiprocess' 模块中更大,因为它使用 dill
而不是 pickle
)。
该程序的目的是测量使用 1 到 7 个进程对 range(1000)
中的数字求平方根所需的时间。我将这个程序循环了 80 次并生成了下图。
关于这个我有几个问题。
- 我是否正确实现了并行化?根据此数据,似乎更多的进程并不等于更少的时间。
- 为什么标准偏差这么大?
=========编辑======
问题 3 已回答
- 我 运行 这个程序两次,两次我的电脑(32Gb 内存、i7 处理器和 8 核)都崩溃了。为什么会这样?
此外,如果有人对 Python 中的并行编程有任何进一步的提示,我们将不胜感激。
干杯。
我用来生成数据的代码:
from multiprocessing import Pool
import numpy
import time
import pandas
import os
import matplotlib.pyplot as plt
import numpy
def sqrt(x):
return numpy.sqrt(x)
num_repeats=100
num_processors=8
if __name__ == '__main__':
for i in range(num_repeats):
t=[]
print 'repeat {}'.format(i)
for j in range(num_processors):
if j!=0:
pool = Pool(j)
start=time.time()
results = [pool.apply_async(sqrt, (x,))for x in range(1000)]
t.append( time.time()-start)
df=pandas.DataFrame(pandas.Series(t))
df= df.transpose()
df.columns=['processor {}'.format(i) for i in range(num_processors-1)]
df.to_csv( os.path.join( os.getcwd(),'parallel_p_test.csv') ,mode='a',header=True)
对于非常快速完成的操作,您会发现并行化不会带来太多好处,因为您将花费大量时间来处理进程同步的开销。
我建议用几秒钟的时间重试。
如果您的计算机崩溃了,那说明有严重问题。什么OS?日志中有什么吗?