为什么使用f字符串进行十六进制时,使用%的字符串来增强字符串?

时间:2017-09-11 18:42:56

标签: python performance python-3.x string-formatting python-3.6

所以我在不同的场景中一直在玩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'慢得多?

1 个答案:

答案 0 :(得分:2)

%x(和其他数字转换)的字符串插值不能重载,因此解释器可以快速执行。

f-strings与format()内置函数相同,它需要在对象上查找__format__方法。这比较慢。

例如,此类可以覆盖%sformat(),但不能覆盖%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,因为它涉及方法调用。