2016-05-09 10 views
1

私はscipy.optimize.brute()を使用していますが、私のコアのうちの1つだけを使用していることに気付きました。グリッド探索の1つの大きな利点は、解アルゴリズムのすべての反復をお互いに独立させることです。Scipy:マルチスレッドのブルート(グリッド検索)?

この場合、brute()が複数のコアで動作するように実装されていないのはなぜですか?正当な理由がない場合 - それを拡張するための素早い方法がありますか、それとも機能させるか、ルーチン全体をゼロから書く方が理にかなっていますか?

答えて

2

scipy.optimize.bruteは任意のPython関数をとります。この関数がスレッドセーフであるという保証はありません。そうであっても、Pythonのグローバルインタプリタロックは、関数がC言語のGILをバイパスしない限り、複数のコアで実行できないことを意味します。

ブルートフォース検索を並列化したい場合は、自分で作成する必要があります。 GILの周りを回るために、CythonやCを書く必要があるかもしれません。

+1

* "関数がC言語のGILをバイパスしない限り、いずれにしても複数のコアで実行することはできません" * - 厳密にはそうではありません。 GILは、CPythonインタプリタが一度に1つのネイティブスレッドしか実行できないことを意味しますが、インタプリタの複数のインスタンスを別々のプロセスで生成し、複数のコアでジョブを同時に実行することができます。これが 'multiprocessing'モジュールの仕組みです。 –

2

scikit-learnがインストールされていますか?少しのリファクタリングでjoblibでマルチプロセッシングをサポートするsklearn.grid_search.GridSearchCVを使用できます。

あなたは.score(...)方法を含め、the generic scikit-learn estimator interfaceを公開するオブジェクトとしてローカルの最適化機能をラップする必要があります(またはあなたがscoring= kwarg経由GridSearchCVコンストラクタに別のスコアリング関数に渡すことができます)。

関連する問題