在评估现有代码是否应切换到
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
目前(从 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