これら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倍遅くなりました。このタイプの違いは正常であり、使用するデータ型を決定するときに期待すべきことと一致していますか?
表示されている時間差に基づいて、おそらく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の方がはるかに高速です。
Python float
は、使用可能な場合はハードウェア浮動小数点レジスタを使用するため、float
を使用すると速度が向上します(そして、それis最新のコンピューターで使用可能)、Decimal
は完全なスカラー/ソフトウェア実装を使用します。
ただし、Decimal
型で古典的な浮動小数点精度の問題がある場合は、float
を使用するとより適切に制御できます。たとえば、古典的なStackOverflow Q&A 浮動小数点演算は壊れていますか? を参照してください。