注意 :此答案是为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(针对该问题而打开)。