2009-08-18 234 views
3

我學習使用numpy的,我想看看在數字列表的總和的速度差所以我做了這個代碼: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 sum函數一起使用?

感謝您的幫助

回答

9

Numpy正在創建一個32位無符號整數的數組。 當它們相加時,它們將它們相加成一個32位的值。

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

可以明確選擇數據類型在創建陣列時間:

a = numpy.arange(1000000, dtype=numpy.uint64) 
a.sum() -> 499999500000 
9

標準列表切換到做算術與長類型時,得到的數字比32位的int大。

numpy數組沒有切換到很長的時間,並且遭受了整數溢出。速度的價格是允許值的較小範圍。

>>> 499999500000 % 2**32 
1783293664L 
6

注意499999500000 % 2**32正好等於1783293664 ...即,numpy的是做業務模2 ** 32,因爲這是你告訴它使用的numpy.array類型。例如,

使np_array = numpy.arange(1000000, dtype=numpy.uint64)和你的總和會出來(儘管當然還有限制,任何有限大小的數字類型)。

您可以使用dtype=numpy.object來告訴numpy該數組包含通用的Python對象;當然,隨着通用性的增加,性能會下降。

相關問題