十进制 Python 与浮点数运行时间

13

只是一个一般性问题,关于使用这两种不同数据类型应该期望什么样的运行时差异。

我的测试:

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倍。当我决定使用哪种数据类型时,这种差异是否正常并符合我的期望?


1
我猜这是因为Python类型float在C中深度实现,而decimal看起来像是一个没有内置到Python解释器中的模块/包。 - linusg
2个回答

24
根据您所看到的时间差异,您可能正在使用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会更快。

8
使用 float 可以获得更快的速度,因为 Python 的 float 类型在现代计算机上使用硬件浮点寄存器(而且现代计算机上已经普及),而 Decimal 类型则使用完整的标量/软件实现。但是,当你遇到 float 类型的经典浮点精度问题时,使用 Decimal 可以获得更好的控制。例如,可以参考经典的 StackOverflow 问答 Is floating point math broken?

是的,我理解我将为时间而牺牲精度,但你认为这样大的差异是典型的吗? - WhitneyChia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接