【发布时间】:2020-01-22 13:22:24
【问题描述】:
我正在检查阶乘的运行时间(必须使用用户定义的函数),但我收到一个奇怪的错误。我正在使用的代码如下:
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 notebook 中运行 Python3。如果有帮助,很高兴回答任何其他问题。
提前感谢您的帮助!
【问题讨论】:
-
我认为这与您的变量名没有任何关系。您最终得到的数字太大而无法存储在您选择的数据类型中。你在用 numpy 吗?
-
以后,请发布一些我们可以实际运行的东西,在运行时重现错误。特别是,如果没有
fact的定义,我们就无法运行它。此外,除非fact本身直接使用 NumPy,否则溢出可能是由您使用 NumPy 数组作为输入触发的,在这种情况下,传递列表(如发布的代码版本)不会触发它。跨度> -
@user2357112supportsMonica 好点,已编辑原始帖子以定义 fact()。对此感到抱歉
-
Numpy 的默认整数大小是
int32。使用int32最多只能计算12!。请注意,即使100!也是一个巨大 数字(它有 158 位数字)。 -
标签: python python-3.x numpy recursion