我有一些代码:
import math, csv, sys, re, time, datetime, pickle, os, gzip
from numpy import *
x = [1, 2, 3, ... ]
y = sum(x)
x
中实际值的总和为2165496761,大于32位整数的限制。报告的y
值为-2129470535
,表示整数溢出。
为什么会这样呢?我以为内置的sum
应该使用Python的任意大小的整数呢?
如果您在REPL(解释器提示符)中意外地执行了类似的操作,请参见How to restore a builtin that I overwrote by accident?。
3条答案
按热度按时间xdyibdwo1#
执行
from numpy import *
会导致内置的sum
函数替换为numpy.sum
:要验证
numpy.sum
是否正在使用,请尝试检查结果的type
:要避免此问题,请不要使用星星导入。
如果必须使用
numpy.sum
,并且想要任意大小的整数结果,请为结果指定dtype
,如下所示:或者显式引用内置的
sum
(可能会给它一个更方便的绑定):jtoj6r0c2#
你得到这个无效值的原因是你在
int32
上使用np.sum
。没有什么可以阻止你不使用np.int32
,而是使用np.int64
或np.int128
dtype
来表示你的数据。顺便说一句,请确保你从来没有使用
from numpy import *
。这是一个可怕的做法和习惯,你必须尽快摆脱。当你使用from ... import *
,你可能会覆盖一些Python内置,这使得调试非常困难。典型的例子,你覆盖像sum
或max
这样的函数...nle07wnf3#
Python可以处理任意精度的大数:
总结一下!
要确保不使用
numpy.sum
,请尝试使用__builtins__.sum()
。