【发布时间】:2016-09-18 19:38:14
【问题描述】:
我从 Python Github 存储库下载了 Python 3.6 alpha 版本,我最喜欢的新功能之一是文字字符串格式化。可以这样使用:
>>> x = 2
>>> f"x is {x}"
"x is 2"
这似乎与在str 实例上使用format 函数的作用相同。但是,我注意到的一件事是,与仅调用 format 相比,这种文字字符串格式化实际上非常慢。以下是timeit 对每种方法的说明:
>>> x = 2
>>> timeit.timeit(lambda: f"X is {x}")
0.8658502227130764
>>> timeit.timeit(lambda: "X is {}".format(x))
0.5500578542015617
如果我使用字符串作为timeit 的参数,我的结果仍然显示模式:
>>> timeit.timeit('x = 2; f"X is {x}"')
0.5786435347381484
>>> timeit.timeit('x = 2; "X is {}".format(x)')
0.4145195760771685
如您所见,使用format 几乎花费了一半的时间。我希望文字方法更快,因为涉及的语法更少。幕后发生了什么导致文字方法慢得多?
【问题讨论】:
-
f 字符串是动态的,因此必须在每个循环中生成字符串;而格式字符串是在代码运行之前创建的文字,当它被转换为字节码时。
-
@AlexHall 也许这与
x在传递给format方法时分配给局部变量的事实有关,但必须由@ 在globals中找到987654333@ 语法。 -
@AlexHall:这不是错误。底层只是一个不同的实现,因为格式字符串必须在编译时解析,而
str.format()在 runtime 解析槽。 -
@PM2Ring:所有表达式在编译时编译并在运行时计算。
-
@MartijnPieters 如果字符串是在运行时编译的,那应该意味着更少的计算。至少如果
.format更快,那么这些字符串应该简单地编译成对.format的调用。
标签: python performance python-internals python-3.6 f-string