2017-01-03 34 views
3

只是關於使用這兩種不同數據類型之間應該期待什麼樣的運行時差異的一般問題。十進制Python與浮點運行時間

我的測試:

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) 

在運行時的區別是:
百萬循環,最好的3:每圈364納秒
10000圈,最好的3:每圈80.3微秒

所以使用小數點比使用浮點數慢大約200倍。這種類型的差異是否正常,並且根據我在決定使用哪種數據類型時應該預期的方式?

+0

我想這是因爲Python類型'float'是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.5x左右。

我關心decimal的表現,Python 3更快。

0

你得到更好的速度與float因爲Python float使用硬件浮點寄存器可用時(這是現代計算機可用的),而Decimal採用全標量/軟件實現。

但是,如果您有float類型的經典浮點精度問題,則可以使用Decimal更好地進行控制。例如,參見經典的StackOverflow Q & A Is floating point math broken?

+0

是的,我知道我會在時間的精確度上交易,但是這是否與你想象的差異有很大關係? – WhitneyChia

+0

@WhitneyChia是的,這聽起來是正確的。 –