所以我在不同的场景中一直在玩f弦和它们的速度。我遇到了f字符串较慢的场景。
修改:x = 0
In[1]: %timeit f"{x:0128x}"
363 ns ± 1.69 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In[2]: %timeit '%0128x' % x
224 ns ± 1.37 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In[3]: %timeit f"{x:0128X}"
533 ns ± 22 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In[4]: %timeit "%0128X" % x
222 ns ± 0.408 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
为什么在这种情况下f字符串较慢,为什么'X'比f字符串的'x'慢得多?
答案 0 :(得分:2)
%x
(和其他数字转换)的字符串插值不能重载,因此解释器可以快速执行。
f-strings与format()
内置函数相同,它需要在对象上查找__format__
方法。这比较慢。
例如,此类可以覆盖%s
和format()
,但不能覆盖%x
:
class myint(int):
def __format__(self, spec):
return "example"
def __int__(self):
return "example"
def __str__(self):
return "example"
def __repr__(self):
return "example"
>>> '%x' % myint()
'0'
大写字符串,在CPython实现中,首先构建小写字符串,然后遍历字符串以更改大小写。
覆盖__str__
,即使返回常量字符串,也会使%s
慢于%x
,因为它涉及方法调用。