Python-并行计算

通过 ipyparallel 包进行并行计算。
具体的内容可以参考:

https://github.com/ipython/ipyparallel
https://ipyparallel.readthedocs.io/en/latest/index/html

开启

使用前,需要以管理员模式打开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)

你可能感兴趣的:(Python-并行计算)