有没有比Python的Decimal更快的替代方案?
有没有人知道在Python中有没有更快的十进制数实现?
下面的例子显示,标准库里的十进制模块比float
慢大约100倍。
from timeit import Timer
def run(val, the_class):
test = the_class(1)
for c in xrange(10000):
d = the_class(val)
d + test
d - test
d * test
d / test
d ** test
str(d)
abs(d)
if __name__ == "__main__":
a = Timer("run(123.345, float)", "from decimal_benchmark import run")
print "FLOAT", a.timeit(1)
a = Timer("run('123.345', Decimal)", "from decimal_benchmark import run; from decimal import Decimal")
print "DECIMAL", a.timeit(1)
输出结果:
FLOAT 0.040635041427
DECIMAL 3.39666790146
5 个回答
3
你应该比较一下十进制和长整型的性能,而不是浮点数。现在的浮点数主要是依赖硬件的。十进制主要用于小数精度,而浮点数则用于更广泛的数值范围。在进行货币计算时,建议使用十进制包。
引用一下十进制包的手册:
十进制数字可以被精确表示。相比之下,像1.1这样的数字在二进制浮点数中并不能被精确表示。普通用户通常不会希望1.1显示成1.1000000000000001,这在二进制浮点数中是常见的现象。
这种精确性在算术运算中也会体现出来。在十进制浮点数中,“0.1 + 0.1 + 0.1 - 0.3”恰好等于零。而在二进制浮点数中,结果是5.5511151231257827e-017。虽然这个结果接近于零,但这种差异会导致无法可靠地进行相等性测试,并且差异可能会累积。因此,在会计应用中,十进制更受欢迎,因为它有严格的相等性要求。
26
你可以试试 cdecimal:
from cdecimal import Decimal
从Python 3.3开始,cdecimal这个实现已经成为了decimal
标准库模块的内置实现,所以你不需要再安装其他东西。只要直接使用decimal
就可以了。
对于Python 2.7来说,安装cdecimal
并用它来替代decimal
,可以让你的程序运行得更快,效果和Python 3默认的速度差不多。