f-strings 与 str.format()

新手上路,请多包涵

我在我的 Python 3.5 项目中经常使用 .format() ,但我担心它会在下一个 Python 版本中被弃用,因为 f-strings,一种新的字符串文字。

 >>> name = "Test"
>>> f"My app name is {name}."
'My app name is Test.'

格式化字符串功能是否可以完全取代旧的 .format() ?从现在开始,在所有情况下都使用新样式会更好吗?

我理解这是基于“简单胜于复杂”的理念。但是,性能问题呢?它们之间有什么区别吗?或者它只是相同功能的简单外观?

原文由 nivhanin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 498
2 个回答

恐怕在下一个 Python 版本中它会被弃用

不要, str.format 不会出现(也没有理由)很快离开,引入 f 前缀字符串的 PEP 甚至 在其摘要中指出

本 PEP 不建议删除或弃用任何现有的字符串格式化机制。

引入格式化字符串是为了解决其他格式化字符串方法的一些缺点;不要扔掉旧方法并强迫天知道有多少项目要使用 f-string,如果他们希望他们的代码适用于 Python 3.6+。


至于它们的性能,我最初怀疑它们可能更慢似乎是错误的,f 弦似乎很容易胜过它们的 .format 对应物:

 ➜ cpython git:(master) ./python -m timeit -s "a = 'test'" "f'formatting a string {a}'"
500000 loops, best of 5: 628 nsec per loop
➜ cpython git:(master) ./python -m timeit "'formatting a string {a}'.format(a='test')"
100000 loops, best of 5: 2.03 usec per loop

在撰写本文时,这些是针对 CPython 存储库的 master 分支完成的;它们肯定会发生变化:

  • f-strings ,作为一项新功能,可能有可能的优化
  • 对 CPython 的优化可能会使 .format 更快(例如 Speedup 方法调用 1.2x

但真的,不要太担心速度,担心什么对你和其他人来说更具可读性。

在许多情况下,这将是 f-strings ,但 在某些情况format 更好。

原文由 Dimitris Fasarakis Hilliard 发布,翻译遵循 CC BY-SA 4.0 许可协议

为了基于 Jim 的回答并解决您的性能问题,我使用了 python 的 dis 模块来比较两个语法不同但功能等效的函数的字节码指令。

 import dis

def f1():
    a = "test"
    return f"{a}"

def f2():
    return "{a}".format(a='test')

print(dis.dis(f1))
print(dis.dis(f2))

结果是:

 11 0 LOAD_CONST 1(“测试”)
              2 STORE_FAST 0 (一)

 12 4 LOAD_FAST 0 (a)
              6 格式值 0
              8 返回值
没有任何
 15 0 LOAD_CONST 1 ('{a}')
              2 LOAD_ATTR 0(格式)
              4 LOAD_CONST 2(“测试”)
              6 LOAD_CONST 3 (('a',))
              8 CALL_FUNCTION_KW 1
             10 返回值
没有任何

可以看出,f 字符串在没有属性或函数调用的情况下处理格式,这会强加类型检查和内存开销。根据 timeit 这导致大约 3 倍的性能提升(针对我的特定功能)

 >>> timeit.timeit('f1()', 'from __main__ import f1', number=100000)
0.012325852433775708
>>> timeit.timeit('f2()', 'from __main__ import f2', number=100000)
0.036395029920726074

原文由 Aaron 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题