Python 对大量数据运行压力测试时出错(长标量中遇到溢出)
我在Jupyter笔记本的压力测试中使用了一个快速算法和一个简单算法运行一个max pairwise产品脚本。当最大数字限制为10000时,我得到了正确的答案,但当我遇到奇怪的错误时。例如,97319*87247不是-99143799。我还得到了以下警告:“RuntimeWarning:在long_标量中遇到溢出”。你知道我该怎么修吗?是因为我在用jupyter吗Python 对大量数据运行压力测试时出错(长标量中遇到溢出),python,algorithm,jupyter-notebook,Python,Algorithm,Jupyter Notebook,我在Jupyter笔记本的压力测试中使用了一个快速算法和一个简单算法运行一个max pairwise产品脚本。当最大数字限制为10000时,我得到了正确的答案,但当我遇到奇怪的错误时。例如,97319*87247不是-99143799。我还得到了以下警告:“RuntimeWarning:在long_标量中遇到溢出”。你知道我该怎么修吗?是因为我在用jupyter吗 压力测试(1010000)-正常 StressTest(10,100000) [30389 11418 34445 51909 5
压力测试(1010000)
-正常
StressTest(10,100000)
[30389 11418 34445 51909 58968 91476 48414 93444]
Fast algorithm: 93444 * 91476 = -42051248
Wrong answer: trivial = 2031152760, algorithm = -42051248
谢谢问题来了整数溢出。在您的环境中,Numpy整数默认为
np.int32
。这可能是因为您安装了32位Python。希望,几乎所有主流桌面计算机都使用64位处理器,这样您就可以在它们上运行64位程序。32位程序在这些平台上已经过时(至少十年以来)。因此,只需使用64位系统和64位Python即可解决此问题
如果您不想更改环境或无法更改环境,则可以尝试使用
np.arange(n,dtype=np.int64)
。这可能行不通。如果是这样,您可以使用np.arange(n,dtype=int)
,这是非常低效的(因为它阻止numpy有效地向量化您的代码),但可以工作。我注意到,如果我将np.arange(n)
更改为[I代表范围内的I(n)]
该代码适用于大整数。问题是numpy的速度部分是通过直接使用C数字类型,而不是使用Python的任意长整数。研究numpy中的数字类型。sys.maxsize
的结果是什么?(导入sys
)很抱歉复活节回复太晚。当我键入sys.maxsize时,我得到:9223372036854775807
Hi。非常感谢你的回复。我实际上安装了Anaconda3 64版本,所以我不确定这是否是原因。
def max_pairwise_product_trivial(numbers):
n = len(numbers)
max_product = 0
for first in range(n):
for second in range(first + 1, n):
max_product = int((max(max_product,numbers[first] * numbers[second])))
return max_product
# Fast algorithm, correct
def max_pairwise_product(numbers):
n = len(numbers)
index_1 = 0
for i in range(1,n):
if numbers[i] > numbers[index_1]:
index_1 = i
if index_1 == 0:
index_2 = 1
else:
index_2 = 0
for i in range(1,n):
if numbers[i] > numbers[index_2] and i != index_1: # numbers[i] != numbers[index_1]
index_2 = i
result = int(numbers[index_1] * numbers[index_2])
print('Fast algorithm: {} * {} = {}'.format(numbers[index_1], numbers[index_2],result))
return result
def StressTest(N, M):
while True:
n = random.randint(2,N)
A = np.arange(n)
for i in range(n):
A[i] = random.randint(0,M)
print(A)
result1 = max_pairwise_product_trivial(A)
result2 = max_pairwise_product(A)
if result1 == result2: print('OK')
else:
print('Wrong answer: trivial = {}, algorithm = {}'.format(result1,result2))
break