十进制Python与浮点runtim

2024-09-27 20:20:16 发布

您现在位置: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)

运行时的区别是:
1000000个环路,最好为3:364 ns/环路
10000圈,最好为3圈:80.3微秒/圈

所以使用decimal要比使用float慢200倍。这种类型的差异是否正常,是否与我在决定使用哪种数据类型时所期望的一致?


Tags: testlenreturndef差异数据类型decimalsum
2条回答

根据您看到的时间差,您可能使用的是Python 2.x。在python2.x中,decimal模块是用Python编写的,速度相当慢。从Python3.2开始,重写的decimal模块是C语言的,速度要快得多。

在我的系统上使用Python 2.7,decimal模块的速度大约慢180倍。使用Python 3.5,decimal模块的速度只有~2.5倍。

如果您关心decimal性能,那么Python 3要快得多。

使用float可以获得更好的速度,因为Python float在可用时使用硬件浮点寄存器(并且它在现代计算机上可用),而Decimal使用完全标量/软件实现。

但是,当Decimal类型存在典型的浮点精度问题时,可以更好地控制Decimal。例如,请参见经典的StackOverflow Q&AIs floating point math broken?

相关问题 更多 >

    热门问题