Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么f字符串解析值的速度比str()快?_Python_Python 3.x_Python Internals_F String - Fatal编程技术网

Python 为什么f字符串解析值的速度比str()快?

Python 为什么f字符串解析值的速度比str()快?,python,python-3.x,python-internals,f-string,Python,Python 3.x,Python Internals,F String,我在玩f字符串(请参阅),我决定检查f字符串解析的速度(例如f“{1}”),与通常的str解析(例如str(1))进行比较。但令我惊讶的是,当我用函数检查这两种方法的速度时,我发现 f弦更快 >>> from timeit import timeit >>> timeit("f'{1}'") 0.1678762999999961 鉴于 >>> timeit("str(1)") 0.3216999999

我在玩f字符串(请参阅),我决定检查f字符串解析的速度(例如
f“{1}”
),与通常的str解析(例如
str(1)
)进行比较。但令我惊讶的是,当我用函数检查这两种方法的速度时,我发现 f弦更快

>>> from timeit import timeit
>>> timeit("f'{1}'")
0.1678762999999961
鉴于

>>> timeit("str(1)")
0.3216999999999999
甚至是repr func,在大多数情况下都比str cast快

>>> timeit("repr(1)")
0.2528296999999995
我想知道这是为什么?我以为f字符串在内部称为str,但现在,我有点困惑,有什么想法吗?提前谢谢

PD:如果有人想知道:

assert f"{1}" == str(1) == repr(1)

简单的答案是,另一方面,
str()
调用需要符号表查找,然后是函数调用

这里有一个插值整型变量的类似示例,将其与常量值插值进行对比

x = 1

%timeit f'{1}'
%timeit f'{x}'
%timeit str(1)
%timeit str(x)

113 ns ± 2.25 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
166 ns ± 4.71 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
342 ns ± 23.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
375 ns ± 11.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

当您使用查看反汇编的字节码时,行为上的差异是显而易见的

import dis

dis.dis("f'{x}'")
  1           0 LOAD_NAME                0 (x)
              2 FORMAT_VALUE             0
              4 RETURN_VALUE

dis.dis("str(x)")
  1           0 LOAD_NAME                0 (str)
              2 LOAD_NAME                1 (x)
              4 CALL_FUNCTION            1
              6 RETURN_VALUE

繁重的工作全在调用函数指令中,这是f-strings肯定没有的开销——至少在这种情况下,因为不需要计算任何东西。

这类似于为什么[]比list()快。相关: