1

Numpy は効率的な数値配列のライブラリです。

mpmath は、gmpy によってサポートされている場合、効率的な多倍数のライブラリです。

それらを効率的にまとめるにはどうすればよいですか?それとも、Numpy 配列と mpmath 番号を使用するだけですでに効率的ですか?

「ネイティブ フロートと同じくらい効率的」を要求するのは意味がありませんが、同等の C コード (または、それが失敗した場合は Java/C# コード) の効率に近づけるように要求することはできます。__add__特に、多倍長数の効率的な配列は、ベクトル化された操作を実行でき、Global Interpreter で 100 万回検索する必要がないことを意味します。

編集:親しい有権者へ:私の質問は、それらをまとめる効率的な方法についてです。可能な重複の答えは、単純なアプローチが効率的ではないことを具体的に指摘しています。

dtype=object の numpy 配列を使用すると、少し誤解を招く可能性があります。これは、標準の dtypes を使用した操作を超高速にする強力な numpy 機構が、デフォルト オブジェクトの python オペレーターによって処理されるようになったためです。つまり、速度が低下します。もう

4

3 に答える 3

2

免責事項:私は維持しgmpy2ます。以下のテストは、開発版で実行されました。

aおよび250 ビットの精度のb擬似乱数値を含む 1000 要素リストです。gmpy2.mpfrこのテストは、2 つのリストの要素ごとの乗算を実行します。

最初のテストでは、リスト内包表記を使用します。

%timeit [x*y for x,y in zip(a,b)]
1000 loops, best of 3: 322 µs per loop

2 番目のテストでは、map関数を使用してループを実行します。

%timeit list(map(gmpy2.mul, a, b))
1000 loops, best of 3: 299 µs per loop

3 番目のテストは、リスト内包表記の C 実装です。

%timeit vector2(a,b)
1000 loops, best of 3: 243 µs per loop

3 回目の試行でvector2は、正常に動作する Python 関数を試みます。数値型はgmpy2の型変換規則を使用して処理され、エラー チェックが行われます。コンテキスト設定がチェックされ、要求された場合は非正規数が作成され、必要に応じて例外が発生します。Python の拡張機能をすべて無視し、すべてを想定すると、値はすでにgmpy2.mpfrで、4 回目の試行で時間を短縮できました。

%timeit vector2(a,b)
10000 loops, best of 3: 200 µs per loop

4 番目のバージョンは、一般的な使用に十分なエラー チェックを行いませんが、3 番目と 4 番目の試みの間のバージョンは可能かもしれません。

Python のオーバーヘッドを減らすことは可能ですが、精度が上がるにつれて、効果的な節約は減少します。

于 2015-07-09T07:46:44.167 に答える
0

私の知る限り、複数の精度値に対するベクトル化された配列操作をサポートする既存の Python ライブラリはありません。残念ながら、numpy ndarray 内で多精度の値を使用する特に効率的な方法はありません。多精度の値は numpy の基本的な配列モデルと互換性がないため、その可能性はほとんどありません。

浮動小数点 numpy ndarray の各要素は同じバイト数を占めるため、配列は、最初の要素のメモリ アドレス、次元、および連続する配列要素間の通常のバイト オフセット (またはストライド) で表すことができます。

このスキームには、パフォーマンス上の大きな利点があります。隣接する配列要素は隣接するメモリ アドレスに配置されるため、配列への順次読み取り/書き込みは参照の局所性が向上します。ストライドは、メモリ内に新しいコピーを作成せずに同じ配列のビューを操作するなどの操作を実行できるため、ユーザビリティにとって非常に重要です。を実行するとx[::2]、実際には、配列の最初の軸でストライドを 2 倍にするだけで、他のすべての要素に対処できます。

対照的に、精度の高い値は精度の低い値よりも多くのバイトを消費するため、複数の精度の値を含む配列には、異なるサイズの要素を含める必要があります。したがって、多倍精度配列は定期的にストライドすることができず、上記の利点を失います。

配列の構築に関する問題に加えて、多精度スカラーの単純な算術演算でさえ、浮動小数点スカラーの場合よりもはるかに遅くなる可能性があります。最近のほとんどすべてのプロセッサは特殊な浮動小数点ユニットを備えていますが、多倍精度演算はハードウェアではなくソフトウェアで実装する必要があります。

これらのパフォーマンスの問題が、探している機能を提供する Python ライブラリがまだ存在しない理由の大きな部分を占めているのではないかと思います。

于 2015-07-07T22:39:44.670 に答える
0

現在のプロジェクトはqdで、値のメモリ内の固定サイズを利用して Numpy 配列に高精度の数値を埋め込むことができます。現在、タイプは Numpy で使用できますが、まだ dtype としては使用できません。ただし、すでにオブジェクト dtype で使用できます。

(dtype がどのように見えるかを確認したい場合は、Numpy サポートを使用してコンパイルするために、関連する行のコメントを既に解除している可能性があります。一目でわかるように動作するはずですが、機能はまだ実装されていません。次のリリースは 9 月または10月。)

于 2015-07-31T07:02:40.973 に答える