python - 分解中型 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。如果有帮助,很高兴回答任何其他问题。
在此先感谢您的帮助!
解决方案
如果(如在您的帖子的当前版本中)您nums
通过调用list
NumPy 数组创建,但为第二个测试编写了一个没有 NumPy 的显式列表文字,那么第二个测试不会发出警告,因为它没有使用 NumPy。nums
是 NumPy 固定宽度整数的列表,而另一个列表是普通 Python 整数的列表。普通的 Python 整数不会溢出。
(如果你想从 NumPy 数组创建一个普通 Python 标量的列表,方法是使用array.tolist()
。由于性能影响,这通常是不可取的,但有时需要与阻塞 NumPy 类型的代码进行互操作。)
由于默认的 Python 警告处理,通常会产生额外的影响。默认情况下,Python 仅在每个 Python 进程的每个代码位置发出一次警告。在您问题的原始版本中,看起来这是造成差异的原因。
使用变量或不使用变量对此警告没有影响。
推荐阅读
- django - 分页不适用于 django rest_framework 中的视图集
- sql - Oracle:如何在不丢失数据的情况下将列数据类型从 VARCHAR 更改为 NUMBER
- javascript - 使用 jQuery 验证表单提交
- generics - 为什么你可以调用一些不带括号的方法,而对于另一些你必须使用括号(Kotlin)?
- php - 如何修复 pg_query
- python - 如果类名有两个单词并且没有id,如何获取css选择器
- reactjs - 使用酶异步安装后测试反应子组件
- c# - WOPI主机中的UnlockAndRelock方法
- json - 我们可以传递 JSON 格式来阅读文档吗?
- html - 为什么我的 html 元素在使用媒体查询时重复和重叠?