在任何实际问题中,将程序并行化一般而言不是一个好的选择。因为除了要考虑问题本身是否具有并行的特征外,在编程的过程中,还涉及到计算资源的调度和处理。这样一来,写并行程序经常会得不偿失。例如矩阵的乘法实际上已经比较困难了,当然这类问题有已经写好的库可以用,例如scalapack等。
但是具体到一些特定的问题,比方程序的过程是完全一样的,只是处理参数不同,这个时候并行的方式相对简单,可以利用python的multiprocessing库进行处理。这里给出一个具体的例子说明。
问题描述
例如要计算10000个数据的正弦值,如果是串行程序的话只需要:
from
如果电脑有10个核的话,那么我们可以把任务等分成10份,然后每个核理论上只需要十分之一的时间,这样相当于加速了十倍。
为了实现这一点,首先要把上面的代码改写成一个函数,这个函数只处理其中1000个值,如下。
from
如何调用多个进程
下面来看如何利用multiprocessing创建十个进程并进行计算。
from numpy import *
from multiprocessing import Pool # 导入多进程中的进程池
def newsin(i):
t=linspace(i,i+1,1000)
return sin(t)
if __name__ == '__main__':
p=Pool(10) #创建含有十个10个进程的进程池
results=[] #存放每一个进程返回的结果
for i in range(10): # 启动10个进程
r=p.apply_async(newsin,args=(i,)) # 产生一个非同步进程,函数newsin的参数用args传递
results.append(r) # 将返回结果放入results
p.close() #关闭进程池
p.join() #结束
如何获得每一个进程返回值
进程的返回值全部在results列表中,如果要获得相应的值可以用下面的方法。
for i in results:
print(i.get())
pause()
总结
当然我也只是找到相应的方案解决了在多核cpu加速的方法,具体的细节也不甚了解。从我测试的结果看,虽然达不到理想的加速,毕竟进程快慢是不一样的,不过对于缓解等待结果的焦虑还是很有帮助的。