Python 对大量数据运行压力测试时出错(长标量中遇到溢出)

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

我在Jupyter笔记本的压力测试中使用了一个快速算法和一个简单算法运行一个max pairwise产品脚本。当最大数字限制为10000时,我得到了正确的答案,但当我遇到奇怪的错误时。例如,97319*87247不是-99143799。我还得到了以下警告:“RuntimeWarning:在long_标量中遇到溢出”。你知道我该怎么修吗?是因为我在用jupyter吗

压力测试(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