您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么在Python 3.6 alpha中文字格式的字符串(f-strings)这么慢?(现已在3.6稳定版中修复)

为什么在Python 3.6 alpha中文字格式的字符串(f-strings)这么慢?(现已在3.6稳定版中修复)

注意 :此答案是为Python 3.6 alpha版本编写的。一个新的操作码添加到3.6.0b1改进的F- 串性能显著。

该@H_502_6@f"..."语法有效地转换为@H_502_6@str.join()对@H_502_6@{...}表达式周围的文字字符串部分的操作,表达式本身的结果通过@H_502_6@object.__format__()方法传递(传递任何@H_502_6@:..格式规范)。拆卸时可以看到以下内容

@H_502_6@>>> import dis
>>> dis.dis(compile('f"X is {x}"', '', 'exec'))
  1           0 LOAD_CONST               0 ('')
              3 LOAD_ATTR                0 (join)
              6 LOAD_CONST               1 ('X is ')
              9 LOAD_NAME                1 (x)
             12 FORMAT_VALUE             0
             15 BUILD_LIST               2
             18 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             21 POP_TOP
             22 LOAD_CONST               2 (None)
             25 RETURN_VALUE
>>> dis.dis(compile('"X is {}".format(x)', '', 'exec'))
  1           0 LOAD_CONST               0 ('X is {}')
              3 LOAD_ATTR                0 (format)
              6 LOAD_NAME                1 (x)
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             12 POP_TOP
             13 LOAD_CONST               1 (None)
             16 RETURN_VALUE

注意结果中的@H_502_6@BUILD_LIST和@H_502_6@LOAD_ATTR .. (join)操作码。新代码@H_502_6@FORMAT_VALUE占据堆栈的顶部,再加上一个格式值(在编译时解析),以将它们合并到@H_502_6@object.__format__()调用中。

因此,您的示例@H_502_6@f"X is {x}"转换为:

@H_502_6@''.join(["X is ", x.__format__('')])

请注意,这需要Python创建一个列表对象,然后调用该@H_502_6@str.join()方法

该@H_502_6@str.format()调用也是一个方法调用,并且在解析后仍然有一个@H_502_6@x.__format__('')涉及到的调用,但是至关重要的是,这里没有涉及创建列表 。正是这种差异使@H_502_6@str.format()方法更快。

请注意,Python 3.6仅作为Alpha版本发布。此实现仍可以轻松更改。有关时间表 ,请参见PEP 494 – Python 3.6发布时间表 ,以及有关如何进一步提高格式化字符串文字性能的讨论,请参见Python问题#27078(针对该问题而打开)。

python 2022/1/1 18:35:02 有435人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶