我正在学习使用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
Run Code Online (Sandbox Code Playgroud)
python_list总和是正确的.
如果我使用总和为1000的相同代码,则两者都打印正确的答案.Numpy数组的长度是上限还是Numpy sum函数?
谢谢你的帮助
当数字大于32位int时,标准列表切换到使用long类型进行算术运算.
numpy数组没有切换到long,并且遭遇整数溢出.速度的价格是允许的较小值范围.
>>> 499999500000 % 2**32
1783293664L
Run Code Online (Sandbox Code Playgroud)
Numpy正在创建一个32位无符号整数的数组.当它们相加时,它将它们相加为32位值.
if 499999500000L % (2**32) == 1783293664L:
print "Overflowed a 32-bit integer"
Run Code Online (Sandbox Code Playgroud)
您可以在阵列创建时显式选择数据类型:
a = numpy.arange(1000000, dtype=numpy.uint64)
a.sum() -> 499999500000
Run Code Online (Sandbox Code Playgroud)
请注意,499999500000 % 2**32正好等于1783293664 ...即,numpy正在进行模2*32的操作,因为这是你告诉它使用的numpy.array的类型.
制作np_array = numpy.arange(1000000, dtype=numpy.uint64),例如,你的总和会出来OK(尽管当然还是有限制,任何有限尺寸号码类型).
您可以使用dtype=numpy.object告诉numpy该数组包含通用Python对象; 当然,随着普遍性的增加,表现会衰退.
| 归档时间: |
|
| 查看次数: |
4533 次 |
| 最近记录: |