Python中Decimal高效格式化方法及性能优化开关排查
Python中高效格式化Decimal的方法与优化检查
为消除浮点舍入误差,我将程序中的float类型替换为Decimal类型,虽预期会有一定性能下降,但仅格式化Decimal并打印日志就带来了远超预期的性能损耗。以下是通过cProfile得到的二者性能对比,想请教两个问题:
- Python中是否存在更高效的
Decimal格式化方法? - 怀疑本地设备上
Decimal的某些优化未开启,该如何检查?
性能测试对比
float格式化测试
测试代码:
from cProfile import Profile a_float = 1234567890.12345 def format_float(value: float) -> str: if value is None: return '' result = f"{value:+,.6f}" return result def test_float(): for i in range(1000000): b = format_float(a_float) p = Profile() p.runcall(test_float) p.print_stats()
测试结果:1000002次函数调用,耗时0.839秒
Decimal格式化测试
测试代码:
from decimal import Decimal from cProfile import Profile a_decimal = Decimal('1234567890.12345') def format_decimal(value: Decimal) -> str: if value is None: return '' result = f"{value:+,.6f}" return result def test_decimal(): for i in range(1000000): b = format_decimal(a_decimal) p = Profile() p.runcall(test_decimal) p.print_stats()
测试结果:55000002次函数调用,耗时27.739秒
后续排查发现
评论区其他用户测试无此性能问题:
- float的调用栈简洁,末尾包含
{method 'disable' of '_lsprof.Profiler' objects},疑似存在底层优化 - 我的Decimal调用栈包含大量函数调用,但其他用户(如Suramuthu R)的Decimal测试调用栈与我的float测试类似,同样有上述优化相关行
推测本地设备上Decimal的某些优化未启用,请教如何检查和开启?
内容的提问来源于stack exchange,提问作者StarterKit
相关产品推荐
相关产品推荐

