Python Decimal - PullRequest
       34

Python Decimal

16 голосов
/ 12 октября 2008

Кто-нибудь знает о более быстрой десятичной реализации в python. Как показано в примере ниже, стандартное десятичное число в python примерно в 100 раз медленнее, чем 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

Спасибо, Максим

Ответы [ 5 ]

21 голосов
/ 19 ноября 2011

Вы можете попробовать cdecimal :

from cdecimal import Decimal

Начиная с Python 3.3, реализация cdecimal теперь является встроенной реализацией стандартного библиотечного модуля decimal, поэтому вам не нужно ничего устанавливать. Просто используйте decimal.

Для Python 2.7 установка cdecimal и использование его вместо decimal должны обеспечить ускорение, аналогичное тому, что Python 3 получает по умолчанию.

11 голосов
/ 12 октября 2008

Библиотека GMP является одной из лучших математических библиотек произвольной точности, и существует привязка Python, доступная в GMPY . Я бы попробовал этот метод.

2 голосов
/ 12 октября 2008

Вы должны сравнить Десятичное число с Длинное целое число производительность, а не с плавающей запятой. Плавающая точка в основном аппаратная. Десятичное число используется для десятичная точность , а Плавающая точка - для более широкого диапазона Используйте пакет decimal для денежных расчетов.

Цитировать десятичное руководство по пакету:

Десятичные числа могут быть представлены точно. Напротив, числа типа 1.1 не имеют точного представления в двоичной с плавающей запятой. Конечные пользователи обычно не ожидают, что 1.1 будет отображаться как 1.1000000000000001, как это происходит с двоичной плавающей запятой.

Точность переносится на арифметику. В десятичном формате с плавающей запятой «0,1 + 0,1 + 0,1 - 0,3» в точности равно нулю. В двоичной форме с плавающей запятой результат равен 5.5511151231257827e-017. Хотя значения близки к нулю, различия мешают надежному тестированию на равенство, и различия могут накапливаться. По этой причине десятичная дробь предпочтительнее в приложениях бухгалтерского учета, которые имеют строгие инварианты равенства.

0 голосов
/ 25 июня 2014

Использование 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 Athlon II 2,1 ГГц)

0 голосов
/ 14 декабря 2012

python Decimal очень медленный, можно использовать float или более быструю реализацию Decimal cDecimal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...