我真的很喜欢深入研究代码风格,很有意思的是知道从现在开始,在所有情况下,使用新的风格是否更好。
我在Python 3.5项目中使用了很多.format()
,我担心在下一个Python版本中会因为这种新的字符串文本而被弃用。
>>> name = "Test"
>>> f"My app name is {name}."
'My app name is Test.'
格式化字符串功能是否完全取代了原来的format()
?
我的理解是基于这样的想法:
Simple is better than complex.
但是,性能问题呢?它们之间有什么区别吗?还是只是同一功能的简单外观?
别这样,
str.format
不会出现(也没有理由)很快就要离开,引入f
前缀字符串的PEP甚至states in its Abstract:引入格式化字符串是为了解决其他格式化字符串的方法所存在的一些缺点;不要抛弃旧的方法,强迫上帝知道如果他们希望自己的代码在Python3.6+上运行,有多少项目可以使用f-string。
至于这些字符串的性能,我最初的怀疑似乎是错误的,f字符串似乎很容易胜过它们的
.format
对应字符串:这些都是在撰写本文时针对CPython存储库的主分支完成的;它们肯定会发生更改:
f-strings
,作为一个新特性,可能有可能的优化.format
更快(例如Speedup method calls 1.2x)但实际上,不要太担心速度,要担心什么对你和其他人来说更可读。
在许多情况下,这将是
f-strings
,但是there's some cases其中format
更好。有一件事没有提到,这使得对旧技术的反对成为可能,那就是插值只针对字符串文本。也就是说,字符串在运行时呈现一次。模板不能与更新的变量一起再次使用。如你所愿:
另一个例子是i18n,其中使用string.Template。如果没有旧的技术,许多用例是不可能的。享受字符串插值,但它不是每个用例都可以使用的,也就是需要可重用模板的地方。
为了构建Jim的答案并解决性能问题,我使用python的
dis
模块来比较两个语法不同但功能相同的函数的字节码指令。其结果是:
可以看到,f-string处理格式时没有属性或函数调用,这会增加类型检查和内存开销。根据
timeit
,这将导致大约3倍的性能提高(对于我的特定功能)相关问题 更多 >
编程相关推荐