You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python中f-string性能不及%格式化符号?

f-string比%格式化慢的原因及最快浮点字符串格式化方式

为什么你的测试里f-string更慢?

你看到的差异核心在于两者对浮点数的格式化逻辑不同,再加上Python 3.10版本的实现细节:

  • '%f %f' % (i, i)是明确指定了定点数格式(保留6位小数),底层直接调用C层面的格式化函数,执行路径短、开销小;
  • 而f'{i} {i}'没有指定格式,Python会自动选择最短且能准确表示该浮点数的字符串形式,这个过程需要额外计算来确定最优输出格式,再加上3.10及更早版本中f-string的表达式解析和格式化路径比%格式化的C实现更绕,自然耗时更长。

如果把f-string改成和%f行为对齐的写法f'{i:.6f} {i:.6f}',再跑测试,两者的耗时会大幅缩小,甚至在多次测试中f-string可能反超%格式化。

哪种浮点数字符串替换方式最快?

要分场景选择:

  • 固定小数位数场景:在Python 3.10及更早版本,'%f'格式化是最快的选择;如果使用Python 3.11+版本,官方对f-string做了大幅性能优化,对齐格式后的f-string(比如f'{x:.6f}')性能会和%格式化持平甚至更优。
  • 默认浮点数表示场景:直接调用str(i)比f-string的f'{i}'更快,因为str(i)是直接调用浮点数的底层字符串转换方法,没有f-string的表达式解析开销。
  • 可读性优先场景:str.format()的性能介于%格式化和f-string之间,但代码可读性更好,适合不需要极致性能的场景。

你可以用下面的测试代码验证不同方式的性能:

from timeit import repeat

setup = 'i = 1.34234324'

test_codes = [
    "'%f %f' % (i, i)",
    "f'{i:.6f} {i:.6f}'",
    "str(i) + ' ' + str(i)",
    "'{} {}'.format(i, i)"
]

for code in test_codes * 5:
    avg_time = min(repeat(code, setup, number=10000)) / 10000
    print(f'{int(avg_time*1e9):4} ns ', code)

内容的提问来源于stack exchange,提问作者Настя Крылова

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:55:21