我正在尝试使用 Python 中的 timeit 模块(编辑:我们正在使用 Python 3)来决定几个不同的代码流。在我们的代码中,我们有一系列 if 语句来测试字符串中是否存在字符代码,如果存在则将其替换为:
if "<substring>" in str_var:
str_var = str_var.replace("<substring>", "<new_substring>")
我们为不同的子字符串多次这样做。我们正在讨论它和只使用这样的替换:
str_var = str_var.replace("<substring>", "<new_substring>")
我们尝试使用 timeit 来确定哪个更快。如果上面的第一个代码块是“stmt1”,第二个是“stmt2”,我们的设置字符串看起来像
str_var = '<string><substring><more_string>',
我们的 timeit 语句将如下所示:
timeit.timeit(stmt=stmt1, setup=setup)
和
timeit.timeit(stmt=stmt2, setup=setup)
现在,像这样运行它,在我们的两台笔记本电脑上(相同的硬件,相似的处理负载)stmt1(带有 if 语句的语句)即使在多次运行后也运行得更快(百分之三到四秒对四分之一秒) stmt2 的秒数)。
但是,如果我们像这样定义函数来做这两件事(包括创建变量的设置):
def foo():
str_var = '<string><substring><more_string>'
if "<substring>" in str_var:
str_var = str_var.replace("<substring>", "<new_substring>")
和
def foo2():
str_var = '<string><substring><more_string>'
str_var = str_var.replace("<substring>", "<new_substring>")
并像运行 timeit 一样:
timeit.timeit("foo()", setup="from __main__ import foo")
timeit.timeit("foo2()", setup="from __main__ import foo2")
没有 if 语句 (foo2) 的语句运行得更快,与无功能的结果相矛盾。
我们是否遗漏了有关 Timeit 工作原理的一些信息?或者 Python 如何处理这样的案例?
编辑这里是我们的实际代码:
>>> def foo():
s = "hi 1 2 3"
s = s.replace('1','5')
>>> def foo2():
s = "hi 1 2 3"
if '1' in s:
s = s.replace('1','5')
>>> timeit.timeit(foo, "from __main__ import foo")
0.4094226634183542
>>> timeit.timeit(foo2, "from __main__ import foo2")
0.4815539780738618
对比这段代码:
>>> timeit.timeit("""s = s.replace("1","5")""", setup="s = 'hi 1 2 3'")
0.18738432400277816
>>> timeit.timeit("""if '1' in s: s = s.replace('1','5')""", setup="s = 'hi 1 2 3'")
0.02985000199987553