1

gmpy モジュールを利用しようとしている間、速度に問題がありました。

import numpy as np
import gmpy2 as gm
N = 1000
a = range(N)
%timeit [gm.sin(x) for x in a]
# 100 loops, best of 3: 7.39 ms per loop
%timeit np.sin(a)
# 10000 loops, best of 3: 198 us per loop

どういうわけかこの計算を高速化できるかどうか疑問に思っていました。JITまたはマルチプロセッシングが役立つかもしれないと思っていましたが、その方法がわかりません。

どんな助けでも大歓迎です。より多くの情報を掲載してほしい場合は、お知らせください。

4

1 に答える 1

3

どれだけパフォーマンスが向上するか興味があったので、リストの を完全に Cgmpy2で計算する新しい関数を書きsinました。残念ながら、あまり改善されませんでした。

%timeit [gmpy2.sin(x) for x in a]
100 loops, best of 3: 4.85 ms per loop
%timeit map(gmpy2.sin, a)
100 loops, best of 3: 4.59 ms per loop
%timeit gmpy2.vector(a)
100 loops, best of 3: 4.44 ms per loop

gmpy2Global Interpreter Lock (GIL) を解放しないため、スレッド化は役に立ちません。

マルチプロセッシングは役立つかもしれませんが、別のプロセスにデータを渡すオーバーヘッドを克服するために、実行に数秒 (またはそれ以上) かかるコードの部分を並列化する必要があるでしょう。

ソフトウェアベースの任意精度の浮動小数点は、ネイティブの浮動小数点よりも遅いだけです。

于 2014-10-28T05:23:22.297 に答える