有没有比Python的Decimal更快的替代方案?

19 投票
5 回答
17500 浏览
提问于 2025-04-11 09:24

有没有人知道在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默认的速度差不多。

12

GMP库是一个非常优秀的任意精度数学库,能够处理非常大的数字。而且在Python中有一个可以使用的接口,叫做GMPY。我建议你试试这个方法。

撰写回答