使用 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))
我想测量几个给出相同结果的打印语句之间的执行时间(在阅读关于 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))