通过 ipyparallel 包进行并行计算。
具体的内容可以参考:
开启
使用前,需要以管理员模式打开cmd,输入
ipcluster start
开启并行python,一般开启的数量和cpu核心数量相同。
可能开启速度没那么快,直到cmd上显示“Engines apear to have started successfully”之后,在jupyter中使用
import ipyparallel as ipp
c=ipp.Client()
c.ids
之后,才能列出所有的进程。
使用
使用时,有两种方法。
直接使用:
并行计算map_sync:每个核将list中一个参数传入function中,进行计算,完成后选取list中其他值再计算。list中值全部进入function中计算后,最后将结果输出到result。functuon没有return可省略“result = ”
result = c[:].map_sync(function,argue_list)
或者
应用计算apply_sync:各个核将同一个参数传入function,计算结果相同。最后将结果输出到result。functuon没有return可省略“result = ”
result = c[:].apply_sync(function,argue)
DirectView使用:
这块不太明白,类似进行实例化,或者选取其中部分核心进行运算。
首先创造1个view:
view = c[0:3]:使用3个核心
result = view.map_sync(function,argue_list):并行计算
result = view.apply_sync(function,argue):应用计算
关闭
将管理员模式的cmd直接关闭后,就关闭了并行核心。
一些问题
开启了,代码没反应
要使用管理员模式cmd才行。正常cmd不可以。
提示ipcluster是不是有效命令
这种情况要将cmd先进入到安装ipyparallel的文件夹下。我的目录路径如下:
cd c:\Program Files\Anaconda3\Scripts
进入此文件夹之后输入
ipcluster start
才能开启核心
管理员cmd之后,map_sync没反应
这是遇见的一个比较奇怪的问题。
如下代码可用:
def f(x):
return x*x
c[:].map_sync(f,[0,1,2,3,4])
但是将f函数换成自己的其他复杂函数就不能用。
测试后发现,在使用自己的复杂函数进行并行计算前,先进行一次小范围的应用计算:
c[:].apply_sync(complex_function,argue)
之后,再进行并行计算,就可以使用了。
function函数中内外部函数问题
使用这个包的时候,每个核在每次运行时可以看做一个新的python程序,也就是说,在前边import的包,也必须重新import。所以必须将所有包的导入代码,以及自己写的def函数都包含在主函数内:
def main_function(argue):
import ....
def sub_function(x):
#sub_function code
return sub_results
#main_function code
return main_results
results = c[:].map_sync(main_function,argue_list)