分解中等 numpy 整数会创建运行时警告



我正在检查阶乘的运行时间(必须使用用户定义的函数(,但我收到一个奇怪的错误。我正在使用的代码如下:

import numpy as np
import time
np.random.seed(14)
nums = list(np.random.randint(low=100, high=500, size=10))
# nums returns as [207, 444, 368, 427, 349, 458, 334, 256, 238, 308]
def fact(x):
if x == 1:
return 1
else:
return x * fact(x-1)
recursion_times = []
recursion_factorials = []
for i in nums:
t1 = time.perf_counter()
factorial = fact(i)
t2 = time.perf_counter()
execution = t2-t1
recursion_factorials.append(factorial)
recursion_times.append(execution)
print(execution)

当我运行上述内容时,我得到以下内容:RuntimeWarning: overflow encountered in long_scalars"""

但是当我按下面的方式运行它时,我没有得到任何警告。

recursion_times = []
recursion_factorials = []
for i in [207, 444, 368, 427, 349, 458, 334, 256, 238, 308]:
t1 = time.perf_counter()
factorial = fact(i)
t2 = time.perf_counter()
execution = t2-t1
recursion_factorials.append(factorial)
recursion_times.append(execution)
print(execution)

我知道调用列表nums有点额外的开销,但为什么它会触发运行时警告?我尝试过四处挖掘,但我只得到动态命名的变量线程和警告抑制库 - 我正在寻找为什么会发生这种情况。

值得一提的是,我在jupyter笔记本中运行Python3。如果有帮助,很高兴回答任何其他问题。

提前感谢您的帮助!

如果(如在当前版本的帖子中(您通过在 NumPy 数组上调用list创建了nums,但为第二个测试编写了一个没有 NumPy 的显式列表文字,那么第二个测试不会发出警告,因为它没有使用 NumPy。nums是 NumPy 固定宽度整数的列表,而另一个列表是普通 Python 整数的列表。普通的 Python 整数不会溢出。

(如果你想从 NumPy 数组创建一个普通 Python 标量的列表,方法是使用array.tolist().由于性能影响,这通常是不可取的,但有时需要与在 NumPy 类型上阻塞的代码进行互操作。


由于默认的 Python 警告处理,通常会有额外的影响。默认情况下,Python 只在每个 Python 进程的每个代码位置发出一次警告。在您的问题的原始版本中,看起来这导致了差异。


使用变量或不使用变量对此警告没有影响。

最新更新