多くの人は「なぜ数学計算にpythonを使用するのでしょうか?」
ツール
上記のように、ツールはscipy.weaveライブラリとopenMPライブラリです。
scipy-応用数学と科学のコンピューティングのためのライブラリのセット。 openMPは、C、C ++、およびFortranプログラムを並列化するためのオープンスタンダードです。
パッケージのインストール
DebianのようなLinuxシステムでは、次のことを行う必要があります。
apt-get python-scipyのインストール apt-get libgomp1のインストール
方法
計算の速度を上げるには、Pythonコードの「狭い」部分(通常、マトリックスで何らかのアクションが発生するサイクル)をCで実装し 、並列化のためのopenMPディレクティブを追加する必要があります。
例
例として次の問題を解決することにより、この方法を検証することよりも良い方法はないと思います。
- サイズn×nの行列、サイズnのベクトル、および整数があります。
- 行列の各行から整数を乗算したベクトルを減算する必要があります(シンプレックス法から)。
Pythonの実装
python cでは、 numpyを使用して、マトリックス生成などのさまざまな準備操作を考慮せずに、このタスクを数行のコードで解決します。
yによるランダム行列xの生成、この場合x = y:
- #行列の行をループします。iは行番号です
- #cは整数、randRowはランダムなベクトル
- xrange ( N )の iの場合:
- 行列[ i ,: ] - = c * randRow
- #ランダム行列xをyで生成
- #行列要素-0から99までの乱数。
- def randMat ( x、y ) :
- randRaw = lambda a : [ randint ( 0、100 ) for i in xrange ( 0 、a ) ]
- randConst = lambda x、y : [ xrange ( 0 、y )の eのrandRaw ( x ) ]
- 配列を返す ( randConst ( x、y ) )
openMPを使用しないScipy.weaveの実装
scipy.weaveは、 pythonコード内でC / C ++コードを使用できるscipyライブラリの一部です。
次のように発生します。
- #Cコード
- codeC =
- 「」 「
- int i = 0;
- for(i = 0; i <N * M; i ++){
- マトリックス[0、i] =マトリックス[0、i]-(c * randRow [i%M]);
- }
- 「 」
- 織ります。 インライン ( codeC、 [ 'matrix' 、 'c' 、 'randRow' 、 'N' 、 'M' ] 、compiler = 'gcc' )
つまり Cコード自体は複数行の文字列として保存され、 Pythonコード変数はCリストに渡されます。ここで、要素は同じテキスト定数です。 また、 numpy配列は、行列の形式ではなくベクトルの形式でCに転送されます。これが、コードに2つではなく1つのサイクルがある理由です。
ちなみに、結果のCコードは/ tmp /%user%/ python2x_intermediate / compiler_xで検索できます
openMPを使用したScipy.weaveの実装
ここで、追加されたバージョンに、 openMPディレクティブを追加し、 インライン呼び出しで欠落しているパラメーターを追加する必要があります。
すべての実装を含む完全なソースコードは、 ここからダウンロードできます。
- #CおよびopenMPコード
- codeOpenMP =
- 「」 「
- int i = 0;
- omp_set_num_threads(2);
- #pragma omp parallel shared(matrix、randRow、c)private(i)
- {
- #pragma omp for
- for(i = 0; i <N * M; i ++){
- マトリックス[0、i] =マトリックス[0、i]-(c * randRow [i%M]);
- }
- }
- 「 」
- ...
- 織ります。 インライン ( codeOpenMP、 [ 'matrix' 、 'c' 、 'randRow' 、 'N' 、 'M' ] 、
- extra_compile_args = [ '-O3 -fopenmp' ] 、
- コンパイラ= 'gcc' 、
- ライブラリ= [ 'gomp' ] 、
- ヘッダー= [ '<omp.h>' ] )
結果の比較
上記のソースコードを実行して、 scipy.weaveが実際に速度を向上させることを確認できます。
サイズのテスト:100x100 ピュアパイソン:0.0725984573364 ピュアC:0.303888320923 CプラスOpenMP:0.109100341797 テスト-OK サイズのテスト:1000x1000 ピュアPython:1.00839138031 ピュアC:0.506997108459 CプラスOpenMP:0.333213806152 テスト-OK サイズのテスト:2000x2000 ピュアパイソン:3.24151515961 ピュアC:2.10800170898 CプラスOpenMP:1.17690563202 テスト-OK サイズのテスト:3000x3000 ピュアPython:5.54490089417 ピュアC:4.61800098419 CプラスOpenMP:2.56960391998 テスト-OK
文学
コードの記述には、次のリソースが使用されました。