关于使用这两种不同数据类型之间应该期望的运行时差异的一般性问题。
我的测试:
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
因此使用十进制比使用浮点数慢约200倍。在决定使用哪种数据类型时,这种差异是否正常并且与我应该期望的一致?
答案 0 :(得分:9)
根据您看到的时差,您可能正在使用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要快得多。
答案 1 :(得分:1)
使用float
可以提高速度,因为Python float
在可用时使用硬件浮点寄存器(并且 在现代计算机上可用),而{{1}使用完整的标量/软件实现。
但是,当Decimal
类型存在经典的浮点精度问题时,使用Decimal
可以更好地控制。例如,请参阅经典的StackOverflow Q& A Is floating point math broken?。