2009-08-18 230 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对象;当然,随着通用性的增加,性能会下降。

相关问题