web-dev-qa-db-ja.com

10進数Python vs.floatランタイム

これら2つの異なるデータ型を使用することでどのような実行時の違いが予想されるかについての一般的な質問です。

私のテスト:

test = [100.0897463, 1.099999939393,1.37382829829393,29.1937462874847272,2.095478262874647474]
test2 = [decimal.Decimal('100.0897463'), decimal.Decimal('1.09999993939'), decimal.Decimal('1.37382829829'), decimal.Decimal('29.1937462875'), decimal.Decimal('2.09547826287')]

def average(numbers, ddof=0):
    return sum(numbers) / (len(numbers)-ddof)

%timeit average(test)
%timeit average(test2)

ランタイムの違いは次のとおりです。
1000000ループ、ベスト3:ループあたり364 ns
10000ループ、ベスト3:ループあたり80.3 µs

したがって、decimalの使用はfloatの使用よりも約200倍遅くなりました。このタイプの違いは正常であり、使用するデータ型を決定するときに期待すべきことと一致していますか?

8
WhitneyChia

表示されている時間差に基づいて、おそらくPython 2.x。Python 2.x、decimalモジュールはPythonで記述されており、かなり低速です。Python 3.2以降、decimalモジュールはCであり、はるかに高速です。

私のシステムでPython 2.7を使用すると、decimalモジュールは約180倍遅くなります。Python 3.5、decimalモジュールを使用するとわずか約2.5倍遅くなります。

decimalのパフォーマンスが気になる場合は、Python 3の方がはるかに高速です。

11
casevh

Python floatは、使用可能な場合はハードウェア浮動小数点レジスタを使用するため、floatを使用すると速度が向上します(そして、それis最新のコンピューターで使用可能)、Decimalは完全なスカラー/ソフトウェア実装を使用します。

ただし、Decimal型で古典的な浮動小数点精度の問題がある場合は、floatを使用するとより適切に制御できます。たとえば、古典的なStackOverflow Q&A 浮動小数点演算は壊れていますか? を参照してください。