14

私は単純な要素単位の行列乗算を高速化しようとして、numba と numexpr をいじっています。私はより良い結果を得ることができませんでした。どちらも基本的に(スピード的に)numpysの乗算関数と同等です。この分野で運が良かった人はいますか?私は numba と numexpr を間違って使用していますか (私はこれにまったく慣れていません)、またはこれを高速化するためのまったく悪いアプローチですか? ここに再現可能なコードがあります。

import numpy as np
from numba import autojit
import numexpr as ne

a=np.random.rand(10,5000000)

# numpy
multiplication1 = np.multiply(a,a)

# numba
def multiplix(X,Y):
    M = X.shape[0]
    N = X.shape[1]
    D = np.empty((M, N), dtype=np.float)
    for i in range(M):
        for j in range(N):
            D[i,j] = X[i, j] * Y[i, j]
    return D

mul = autojit(multiplix)
multiplication2 = mul(a,a)

# numexpr
def numexprmult(X,Y):
    M = X.shape[0]
    N = X.shape[1]
    return ne.evaluate("X * Y")

multiplication3 = numexprmult(a,a) 
4

5 に答える 5

4

編集:この答えを気にしないでください、私は間違っています(以下のコメントを参照)。


numpy を使用するよりも、Python で行列の乗算を高速化するのは非常に難しいと思います。NumPy は通常、非常によく最適化された ATLAS/LAPACK のような内部の fortran ライブラリを使用します。

お使いの NumPy のバージョンが LAPACK サポート付きでビルドされているかどうかを確認するには: ターミナルを開き、Python インストール ディレクトリに移動して、次のように入力します。

for f in `find lib/python2.7/site-packages/numpy/* -name \*.so`; do echo $f; ldd $f;echo "\n";done | grep lapack

パスは、Python のバージョンによって異なる場合があることに注意してください。いくつかの行が印刷された場合、LAPACK がサポートされていることは間違いありません...そのため、単一のコアでより高速な行列乗算を実現するのは非常に困難です。

複数のコアを使用して行列乗算を実行する方法についてはわかりませんので、それを調べてみてください (ali_m のコメントを参照)。

于 2013-10-16T09:33:55.450 に答える
2

GPU を使用します。以下のパッケージを使用してください。

ガンピー

于 2013-10-19T09:38:54.930 に答える
2

の速度はnp.multiply、配列がまったく同じサイズであることに大きく依存します。

a = np.random.rand(80000,1)
b = np.random.rand(80000,1)

c = np.multiply(a, b)

次のコードは 1 分以上かかり、16 GB の RAM をすべて使い果たします。

a = np.squeeze(np.random.rand(80000,1))
b = np.random.rand(80000,1)

c = np.multiply(a, b)

したがって、私のアドバイスは、まったく同じ次元の配列を使用することです。要素ごとの乗算を高速化する方法を探している人にとって、これが役立つことを願っています。

于 2020-08-05T14:24:04.923 に答える