我试图通过timeit
模块来估计运行算法的时间。但是我在与f-string
传递stmt
论点时遇到了问题.为了演示我的问题,我创建了两个简单的函数来返回斐波那契数作为示例:
def fibo_exponential(n):
if n == 0:
return 0
elif n == 1:
return 1
return fibo(n-1) + fibo(n-2)
def fibo_linear(n):
List = [0]*3
List[0] = 0
List[1] = 1
for i in range(2,n+1):
List[2] = List[1] + List[0]
List[0] = List[1]
List[1] = List[2]
return List[2]
from timeit import timeit
def time():
print(timeit('fibo_linear(10)', 'from __main__ import fibo_linear', number=100000))
print(timeit('fibo_exponential(10)', 'from __main__ import fibo_exponential', number=100000))
print(timeit(f"{fibo_linear(10)}", 'from __main__ import fibo_linear', number=100000))
print(timeit(f"{fibo_exponential(10)}", 'from __main__ import fibo_linear', number=100000))
结果如下所示:
time() # The argument for stmt list below:
0.21902308000426274 # 'fibo_linear(10)'
2.1373995500034653 # 'fibo_exponential(10)'
0.0006944179913261905 # f"{fibo_linear(10)}"
0.0006128590030129999 # f"{fibo_exponential(10)}"
我的问题是,为什么使用 f 字符串格式时时间不同?
timeit
获取给定的字符串,并将其作为python代码进行评估。
请注意,将立即计算 f 字符串。当你这样做时
f'{fibo_linear(10)}'
fibo_linear(10)
将解析为 55,然后字符串解析为'55'
.
因此,在前两个示例中,您告诉timeit
评估以下行作为 python 代码:
'fibo_linear(10)'
'fibo_exponential(10)'
但是在你的后两个例子中,你告诉它评估这一点:
'55'
当然,这几乎是瞬间的。因为它,你知道,一个常数。
换句话说,f'{fibo_linear(10)}' == '55'
是True
。