就很简单的一个求和计算:
import numpy as np
np.sum(range(10000000))
Out[117]: -2014260032
和直接用内置的函数计算结果不一样
sum(range(10000000))
Out[118]: 49999995000000
后来我用二分法验证了一下临界值是多少
np.sum(range(i)) == sum(range(i))
验证了几次差不多猜出来了,是2**16=65536
np.sum(range(65536)) == sum(range(65536))
Out : True
超过这个数就不行,这不是有很大的安全隐患啊,这还怎么用numpy的内置函数,而且速度感觉也不怎么样,没sum快,可能是溢出影响效率的问题吧(猜测)
但是我觉得np和python一样是支持无限大整数的,验证确实这样:
np.array(range(2**20))
可以正常运行
我感觉是不是历史遗留问题啊,求个sum都可以溢出
是不是直接用sum替换之就可以了,大家对这有什么看法?
有没有人遇到过类似的问题?
谢谢
我觉得我可以去report bug一波了23333
np.sum(np.array(range(10000000), dtype=float))
numpy底层用c优化的,应对任何数学问题,默认的dtype是int32,当然溢出来啦