我正在使用scipy.optimize.brute()
,但我注意到它只使用了我的一个内核。网格搜索的一个很大的优点是使求解算法的所有迭代都相互独立。
既然如此,为什么brute()
没有实现为在多核上运行?如果没有好的理由,是否有一种快速的方法来扩展它/使它工作,或者从头开始编写整个例程更有意义?
我正在使用scipy.optimize.brute()
,但我注意到它只使用了我的一个内核。网格搜索的一个很大的优点是使求解算法的所有迭代都相互独立。
既然如此,为什么brute()
没有实现为在多核上运行?如果没有好的理由,是否有一种快速的方法来扩展它/使它工作,或者从头开始编写整个例程更有意义?
2条答案
按热度按时间x9ybnkn61#
scipy.optimize.brute
接受一个任意的Python函数。不能保证这个函数是线程安全的。即使它是线程安全的,Python的全局解释器锁意味着除非这个函数绕过C语言中的GIL,否则它不能在多个内核上运行。如果你想并行化你的暴力搜索,你应该自己编写它。你可能必须编写一些Cython或C来绕过GIL。
f0brbegy2#
你安装了scikit-learn吗?通过一些重构,你可以使用
sklearn.grid_search.GridSearchCV
,它通过joblib
支持多处理。你需要将你的局部优化函数 Package 成一个公开通用scikit-learn估计器接口的对象,包括一个
.score(...)
方法(或者你可以通过scoring=
kwarg将一个单独的评分函数传递给GridSearchCV
构造函数)。