百分比格式化速度是 Python 3.x 中 f 字符串的两倍

问题描述 投票:0回答:1

在评估现有代码是否应切换到

str.format
/
f-strings
时,我发现旧式百分比格式的性能大约是原来的两倍。

虽然我意识到这种差异在很多情况下可能并不重要,并且总是可以就一些微小的性能差异提出可读性的争论。 有时差异可能很重要 - 例如将大量数据转储到文件中

该测试是否可以公平衡量 CPython 中格式化方法之间的性能差异?

简单的计时脚本:

import time
REPETITIONS = 1_000_000
a, b, c, d, e, f, g, h = [str(a) for a in range(8)]

print("Percentage formatting: '%s'")
t = time.process_time()
for i in range(REPETITIONS):
    n = (
        "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s" %
        (a, b, c, d, e, f, g, h, a, b, c, d, e, f, g, h)
    )
print(time.process_time() - t, '\n')

print("'str.format' formatting: '{:s}'")
t = time.process_time()
for i in range(REPETITIONS):
    n = "{:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s}".format(
        a, b, c, d, e, f, g, h, a, b, c, d, e, f, g, h,
    )
print(time.process_time() - t, '\n')

print("'f-string' formatting: '{:s}'")
t = time.process_time()
for i in range(REPETITIONS):
    n = f"{a:s} {b:s} {c:s} {d:s} {e:s} {f:s} {g:s} {h:s} {a:s} {b:s} {c:s} {d:s} {e:s} {f:s} {g:s} {h:s}"
print(time.process_time() - t, '\n')

使用 Python 3.8 和 3.9b3,我得到类似的时间,示例输出。

Percentage formatting: '%s'
1.163297844

String __format__ formatting: '.format()'
1.9792420380000002

F-String formatting: f'...'
2.3670744659999996

Python 3.12。

Percentage formatting: '%s'
0.9905710179999999 

'str.format' formatting: '%s'
1.6725556810000002 

'f-string' formatting: '%s'
2.319630944 
performance cpython f-string
1个回答
0
投票

目前(从 v3.12 开始),传入类型说明符时格式化字符串时,f 字符串速度较慢。这是一个更新的脚本,其中的计时显示了使用/不使用

{:s}
进行格式化的速度。

import time
REPETITIONS = 1_000_000
a, b, c, d, e, f, g, h = [str(a) for a in range(8)]

print("Percentage formatting: '%s'")
t = time.process_time()
for i in range(REPETITIONS):
    n = (
        "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s" %
        (a, b, c, d, e, f, g, h, a, b, c, d, e, f, g, h)
    )
print(time.process_time() - t, '\n')

print("'str.format' formatting: '{:s}'")
t = time.process_time()
for i in range(REPETITIONS):
    n = "{:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s}".format(
        a, b, c, d, e, f, g, h, a, b, c, d, e, f, g, h,
    )
print(time.process_time() - t, '\n')

print("'str.format' formatting: '{}'")
t = time.process_time()
for i in range(REPETITIONS):
    n = "{:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s} {:s}".format(
        a, b, c, d, e, f, g, h, a, b, c, d, e, f, g, h,
    )
print(time.process_time() - t, '\n')

print("'f-string' formatting: '{:s}'")
t = time.process_time()
for i in range(REPETITIONS):
    n = f"{a:s} {b:s} {c:s} {d:s} {e:s} {f:s} {g:s} {h:s} {a:s} {b:s} {c:s} {d:s} {e:s} {f:s} {g:s} {h:s}"
print(time.process_time() - t, '\n')

print("'f-string' formatting: '{}'")
t = time.process_time()
for i in range(REPETITIONS):
    n = f"{a} {b} {c} {d} {e} {f} {g} {h} {a} {b} {c} {d} {e} {f} {g} {h}"
print(time.process_time() - t, '\n')

输出:

Percentage formatting: '%s'
0.75952339 

'str.format' formatting: '{:s}'
0.9916601150000001 

'str.format' formatting: '{}'
0.995075492 

'f-string' formatting: '{:s}'
1.9585413649999999 

'f-string' formatting: '{}'
0.6409607900000003
© www.soinside.com 2019 - 2024. All rights reserved.