使用 timeit 比较不​​同语句之间的执行时间(以毫秒为单位)

Using timeit to compare the execution time in milliseconds between different statements

我想测量几个给出相同结果的打印语句之间的执行时间(在阅读关于 python 的一本书之后,其中指出使用 f-strings 比使用 str.format 更有效( ) 和 % 占位符)。我的 python 是 v 3.8.8.

这是我的例子:

姓名='Kimberley'

f'你好,{name},今天过得怎么样? # 方法一

'Hello, {0}, how is your day?'.format(name) #方法2

'Hello, %(who)s, how is your day?' % {'who': name} # 方法 3 应该是最慢的。

所以我首先尝试了这个,但它不起作用,因为 'name' 没有在函数中定义。

import timeit
name = 'Kimberley'
timeit.timeit(stmt= "f'Hello, {name}, how is your day?'")

然后我尝试了这个,但是对于每种方法它都给出了 0:00:00.000038 的相似结果。

from timeit import default_timer as timer
from datetime import timedelta

# method 1
start = timer()

name = 'Kimberley'
f'Hello, {name}, how is your day?'

end = timer()
print(timedelta(seconds=end-start))


...
#method 3
start = timer()

name = 'Kimberley'
'Hello, %(who)s, how is your lamb?' % {'who': name} 

end = timer()
print(timedelta(seconds=end-start))

然而,这是不对的,因为书上说方法1、方法2和方法3分别需要大约0.06、0.16和0.21毫秒来执行。

所以我想知道如何使用 timeit() 来正确测量执行时间?

default_timer 不是衡量微小代码片段的最佳方式,因为它很容易受到其他系统进程的影响,而且花费的时间很短,需要 运行 多次才能衡量意义重大。

相反,使用 timeit.timeit 如下,在 setup 块中指定特定于测试的变量。

from timeit import timeit

setup = """
name = "Kimberley"
"""

method1 = """f'Hello, {name}, how is your day?'"""
method2 = """'Hello, {0}, how is your day?'.format(name)"""
method3 = """'Hello, %(who)s, how is your lamb?' % {'who': name}"""
method4 = """Hello, %s, how is your lamb?' % (name,)"""

for method in (method1, method2, method3, method4):
    print(timeit(setup=setup, stmt=method))
# 0.0563660740153864
# 0.17292902698274702
# 0.18335944903083146
# 0.09785140998428687

当然要注意这些时间(ms)是timeit每条语句执行1000000次的时间

我还添加了 method4,它比 3 快,因为它不必执行从 who 到 [=18= 的 'mapping' ].

我在上面的解决方案之后发现了另一种使用 globals=globals() 的方法。

setup = "name = 'Kimberley'"

method1 = "f'Hello, {name}, how is your day?'"
method2 = "'Hello, {0}, how is your day?'.format(name)"
method3 = "'Hello, %(who)s, how is your day?' % {'who': name}"
method4 = "'Hello, %s, how is your day?' % (name,)"

for method in (method1, method2, method3, method4):
    print(timeit(globals=globals(), stmt=method))