最近在看scikit learn的random forest源码,之后会公布一些简化版的代码,欢迎大家关注。
【predict_proba】中有一块代码不清楚怎么回事。
https://github.com/scikit-learn/scikit-learn/blob/51a765a/sklearn/ensemble/forest.py#L543
# Parallel loop
all_proba = Parallel(n_jobs=n_jobs, verbose=self.verbose,
backend="threading")(
delayed(_parallel_helper)(e, 'predict_proba', X,
check_input=False)
for e in self.estimators_)
看了这个链接,写得简单易懂【Embarrassingly parallel for loops】:
http://blog.csdn.net/donger_soft/article/details/45305971
一般用法
Joblib提供了一个简单的帮助类来编写并行化的循环。其核心思想是把代码写成生成器表达式的样子,然会再将它转换为并行计算:
>>> from math import sqrt
>>> [sqrt(i ** 2) for i in range(10)]
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
使用以下方式,可将计算分布到两个CPU上:
>>> from math import sqrt
>>> from joblib import Parallel, delayed
>>> Parallel(n_jobs=2)(delayed(sqrt)(i ** 2) for i in range(10))
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
以上,
Parallel
对象会创建一个进程池,以便在多进程中执行每一个列表项。函数
delayed
是一个创建元组
(function, args, kwargs)
的简单技巧。
注意
在Windows上使用joblib.Parallel的时候,要保护主循环以避免递归生成子进程 。换句话说,你的代码应该如下:
import .... def function1(...): ... def function2(...): ... ... if __name__ == '__main__': # do stuff with imports and functions defined about ...