17

有谁知道python中更快的十进制实现?

如下例所示,标准库的十进制模块比float.

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
4

5 回答 5

23

您可以尝试cdecimal

from cdecimal import Decimal

从 Python 3.3 开始,cdecimal 实现现在是标准库模块的内置实现decimal,因此您无需安装任何东西。只需使用decimal.

对于 Python 2.7,安装cdecimal和使用它而不是decimal应该提供类似于 Python 3 默认获得的加速。

于 2011-11-19T08:47:41.700 回答
11

GMP库是最好的任意精度数学库之一,在 GMPY 上有一个Python绑定。我会尝试这种方法。

于 2008-10-12T05:11:37.947 回答
2

您应该将DecimalLong Integer性能进行比较,而不是浮点。如今,浮点主要是硬件。Decimal用于十进制精度,而Floating Point用于更广泛的范围。使用十进制包进行货币计算。

引用十进制包手册:

十进制数可以精确表示。相反,像 1.1 这样的数字在二进制浮点中没有精确的表示。最终用户通常不会期望 1.1 显示为 1.1000000000000001,因为它使用二进制浮点数。

精确性延续到算术上。在十进制浮点中,“0.1 + 0.1 + 0.1 - 0.3”正好等于零。在二进制浮点中,结果为 5.5511151231257827e-017。虽然接近于零,但差异会阻止可靠的相等性测试,并且差异会累积。出于这个原因,在具有严格等式不变量的会计应用程序中,十进制将是首选。

于 2008-10-12T05:55:38.843 回答
2

使用cDecimal

将以下内容添加到您的基准测试中:

a = Timer("run('123.345', Decimal)", "import sys; import cdecimal; sys.modules['decimal'] = cdecimal; from decimal_benchmark import run; from decimal import Decimal")
print "CDECIMAL", a.timeit(1)

我的结果是:

FLOAT 0.0257983528473
DECIMAL 2.45782495288
CDECIMAL 0.0687125069413

(Python 2.7.6/32、Win7/64、AMD 速龙 II 2.1GHz)

于 2014-06-25T12:33:07.310 回答
0

python Decimal 非常慢,可以使用 float 或 Decimal cDecimal 的更快实现。

于 2012-12-14T10:04:14.223 回答