首页 > 解决方案 > 分解中型 Numpy Ints 会产生运行时警告

问题描述

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

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)

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

对于它的价值,我在 jupyter notebook 中运行 Python3。如果有帮助,很高兴回答任何其他问题。

在此先感谢您的帮助!

标签: pythonpython-3.xnumpyrecursion

解决方案


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

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


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


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


推荐阅读