gpt4 book ai didi

python - 使用 WinPython 时,Python 中出现大量素数列表时出现意外的 sum(list) 行为

转载 作者:行者123 更新时间:2023-12-01 05:16:52 24 4
gpt4 key购买 nike

我的代码返回了一些我不理解的内容。该算法非常简单,它将 X 以内的质数添加到列表中,然后将所有数字相加。

如果 X 很小,累积循环和 sum(list) 函数会给我相同的答案,但是当 X 很大时......结果不同,我真的不明白为什么!

编辑:我在使用 WinPython 的 3.3 上遇到问题,我无法在库存发行版中重现该问题

这是我的代码,没有 is_prime 函数,但包含我尝试的测试的输出:

num_max=2*10**6
accu=[2]
total=2

#EDIT : here is the prime function
def is_prime(num):
if num%2 == 0 and num != 2 or num%3 == 0 and num != 3:
return False
for i in range(1, int((num**0.5+1)/6+1)):
if num%(6*i+1) == 0:
return False
if num%(6*i-1) == 0:
return False
return True
# END OF EDIT

for i in range(3, num_max, 2):
if is_prime(i) == True:
accu.append(i)
total += i

print(sum(accu)) # prints : 1179908154
print(total) # prints : 142913828922

# Test 1 --> The list "accu" seems to be created properly
tout=0
for num in accu:
tout+=num
print(tout) # prints : 142913828922

# Test 2 --> Also, I don't understand why sum() works on the first part of the list!
print(sum(accu[:1000])) # prints : 3682913
tot=0
for i in range(1000):
tot+=accu[i]
print(tot) # prints : 3682913

感谢您的帮助!

最佳答案

您的设置正在将 numpy.sum 导入到全局变量中,这会隐藏 Python 的 builtins.sum

在本例中,np.sum 调用 ufunc 方法 np.add.reduce。在 C API 中,这调用 PyUFunc_GenericReduction ,它调用 PyArray_FromAny将输入列表转换为 ndarray。当序列中的最大整数小于或等于 LONG_MAX 时,此数组的数据类型设置为 long,就像 accu 的情况一样。随后,求和会溢出,因为在 32 位和 64 位 Windows 上 LONG_MAX 均为 2 ** 31 - 1。例如:

>>> max(accu)
1999993
>>> np.sum(accu)
1179908154
>>> np.sum(accu, dtype='int32')
1179908154
>>> np.sum(accu, dtype='int64')
142913828922

关于python - 使用 WinPython 时,Python 中出现大量素数列表时出现意外的 sum(list) 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23017258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com