2017-01-03 7 views
3

これら2つの異なるデータ型を使用する際にどのようなランタイムの違いが予想されるのかという一般的な質問です。小数点のPythonとfloatランタイム

私のテスト:

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ナノ秒
10000ループ、3の最高:ループあたり80.3マイクロ秒

だから小数点を使うことは浮動小数点を使うよりも約200倍遅かった。このタイプの違いは、どのデータ型を使用するかを決める際に、私が期待しなければならない線に沿っていますか? Decimalがフルスカラー/ソフトウェア実装を使用一方

+0

これは、 'float'というPython型がCで深く実装されているのに対し、' decimal'はPythonインタプリタに組み込まれていないモジュール/パッケージのように見えるからです。 – linusg

答えて

4

あなたが見ている時差に基づいて、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ははるかに高速です。

0

あなたが使用可能な場合はPython floatは、ハードウェア浮動小数点レジスタを使用しているためfloatとのより良いスピードを得る、(をし、それが現代のコンピュータで利用可能です)。

ただし、floatタイプの古典的な浮動小数点精度の問題がある場合は、Decimalで制御する方がよいでしょう。たとえば、古典的なStackOverflow Q & A Is floating point math broken?を参照してください。

+0

ええ、私は時間の正確さを犠牲にしていることを理解していますが、これはあなたが思う典型的な違いの大きなものですか? – WhitneyChia

+0

@WhitneyChiaええ、そうだね。 –

関連する問題