我正在学习使用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函数?
感谢您的帮助
答案 0 :(得分:9)
当数字大于32位int时,标准列表切换到使用long类型进行算术运算。
numpy数组没有切换到long,并且遇到整数溢出。速度的价格是允许的较小值范围。
>>> 499999500000 % 2**32
1783293664L
答案 1 :(得分: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
答案 2 :(得分:6)
请注意499999500000 % 2**32
完全等于1783293664 ...即,numpy正在进行模2 * 32的操作,因为这是你告诉它使用的numpy.array的类型。
制作np_array = numpy.arange(1000000, dtype=numpy.uint64)
,你的总和就会好(虽然当然还有限制,任何有限大小的数字类型)。
您可以使用dtype=numpy.object
告诉numpy该数组包含通用Python对象;当然,随着普遍性的增加,表现会衰退。