Is there a faster alternative to python's Decimal?

前端 未结 5 709
野趣味
野趣味 2021-02-05 09:51

Does anyone know of a faster decimal implementation in python?

As the example below demonstrates, the standard library\'s decimal module is ~100 times slower than

相关标签:
5条回答
  • 2021-02-05 10:23

    The GMP library is one of the best arbitrary precision math libraries around, and there is a Python binding available at GMPY. I would try that method.

    0 讨论(0)
  • 2021-02-05 10:23

    You should compare Decimal to Long Integer performance, not floating point. Floating point is mostly hardware these days. Decimal is used for decimal precision, while Floating Point is for wider range. Use the decimal package for monetary calculations.

    To quote the decimal package manual:

    Decimal numbers can be represented exactly. In contrast, numbers like 1.1 do not have an exact representation in binary floating point. End users typically would not expect 1.1 to display as 1.1000000000000001 as it does with binary floating point.

    The exactness carries over into arithmetic. In decimal floating point, "0.1 + 0.1 + 0.1 - 0.3" is exactly equal to zero. In binary floating point, result is 5.5511151231257827e-017. While near to zero, the differences prevent reliable equality testing and differences can accumulate. For this reason, decimal would be preferred in accounting applications which have strict equality invariants.

    0 讨论(0)
  • 2021-02-05 10:42

    Use cDecimal.

    Adding the following to your benchmark:

    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)
    

    My results are:

    FLOAT 0.0257983528473
    DECIMAL 2.45782495288
    CDECIMAL 0.0687125069413
    

    (Python 2.7.6/32, Win7/64, AMD Athlon II 2.1GHz)

    0 讨论(0)
  • 2021-02-05 10:44

    You can try cdecimal:

    from cdecimal import Decimal
    

    As of Python 3.3, the cdecimal implementation is now the built-in implementation of the decimal standard library module, so you don't need to install anything. Just use decimal.

    For Python 2.7, installing cdecimal and using it instead of decimal should provide a speedup similar to what Python 3 gets by default.

    0 讨论(0)
  • 2021-02-05 10:44

    python Decimal is very slow, one can use float or a faster implementation of Decimal cDecimal.

    0 讨论(0)
提交回复
热议问题