3

Numpyの使い方を学んでいて、数値のリストの合計で速度の違いを確認したかったので、次のコードを作成しました。

np_array = numpy.arange(1000000)
start = time.time()
sum_ = np_array.sum()
print time.time() - start, sum_

>>> 0.0 1783293664

python_list = range(1000000)
start = time.time()
sum_ = sum(python_list)
print time.time() - start, sum_

>>> 0.390000104904 499999500000

python_listの合計は正しいです。

合計を1000にして同じコードを実行すると、どちらも正しい答えを出力します。Numpy配列の長さに上限はありますか、それともNumpy合計関数を使用しますか?

ご協力いただきありがとうございます

4

3 に答える 3

9

標準リストは、数値が 32 ビットの int よりも大きくなると、long 型で演算を行うように切り替わりました。

numpy 配列が long に切り替わらず、整数オーバーフローが発生しました。速度の代償は、許容される値の範囲が狭いことです。

>>> 499999500000 % 2**32
1783293664L
于 2009-08-18T19:38:08.393 に答える
9

Numpy は 32 ビットの unsigned int の配列を作成しています。それらを合計すると、32 ビット値に合計されます。

if 499999500000L % (2**32) == 1783293664L:
    print "Overflowed a 32-bit integer"

配列の作成時にデータ型を明示的に選択できます。

a = numpy.arange(1000000, dtype=numpy.uint64)
a.sum() -> 499999500000
于 2009-08-18T19:40:03.693 に答える
6

正確に 1783293664に等しいことに注意して499999500000 % 2**32ください...つまり、numpy は 2**32 を法とする操作を行っています。これは、使用するように指示した numpy.array のタイプであるためです。

たとえば、 Makenp_array = numpy.arange(1000000, dtype=numpy.uint64)を使用すると、合計が問題なく出力されます (ただし、有限サイズの数値型にはまだ制限があります)。

を使用dtype=numpy.objectして、配列が一般的な Python オブジェクトを保持していることを numpy に伝えることができます。もちろん、一般性が高まるにつれてパフォーマンスは低下します。

于 2009-08-18T19:43:12.953 に答える