Timeit 模块,三引号代码 vs 函数

Timeit module, triple quotes code vs function

我使用 timeit 模块来衡量我的代码的执行情况,在检查不同的脚本时,我发现 'the same script' 上存在很大差异,但定义方式不同。

Code.py 导入时间

code = '''
def count():
    for i in range(100):
        pass
'''
   
def count():
    for i in range(100):
        pass

print(timeit.timeit(code))
print(timeit.timeit(count))

输出:

0.17939981000017724
3.7566073690004487

幕后到底发生了什么?我的意思是,在这两种情况下,这段代码完全相同,但执行时间差异很大。

code 仅在字符串中而不是函数定义中。

code = '''
def count():
    for i in range(100):
        pass
'''

它不执行任何计算或迭代。 code:

'\ndef count():\n    for i in range(100):\n        pass\n'

count 是:

<function __main__.count()>

在字符串示例中,您只是在定义函数而不是实际调用它,因此您实际上是在为函数的创建而不是它的执行计时。

您需要在 code 字符串的末尾附加一个 count() 函数调用,以使其真正 运行 并包含在分析中。

code = '''
def count():
    for i in range(100):
        pass
count()
'''

但请注意,从技术上讲,您在字符串示例中为函数声明和执行计时,而在第二个示例中仅为函数调用计时。

这样比较会更公平:

code = '''
def count():
    for i in range(100):
        pass
'''
   
def count2():
    for i in range(100):
        pass

print(timeit.timeit("count()", setup=code))
print(timeit.timeit(count2))