在python中,哪种方法是将浮点转换为int的有效方法?

2024-04-19 05:20:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在使用n = int(n)float转换为int。在

最近,我遇到了另一种方法来做同样的事情:

n = n // 1

哪种方法最有效,为什么?在


Tags: 方法float事情int
3条回答

实际上,int似乎比除法快。慢的部分是在全局范围内查找函数。在

如果我们避免的话,这里是我的数字:

$ python -mtimeit -s 'i=int; a=123.456' 'i(a)'
10000000 loops, best of 3: 0.122 usec per loop
$ python -mtimeit -s 'i=int; a=123.456' 'a//1'
10000000 loops, best of 3: 0.145 usec per loop

timeit测试它:

$ bin/python -mtimeit -n10000000 -s 'n = 1.345' 'int(n)'
10000000 loops, best of 3: 0.234 usec per loop
$ bin/python -mtimeit -n10000000 -s 'n = 1.345' 'n // 1'
10000000 loops, best of 3: 0.218 usec per loop

所以楼层划分只是一个很小的差距。注意,这些值是非常接近的,我不得不增加循环重复计数,以消除对我的机器的随机影响。即使有这么高的计数,你也需要重复几次实验,看看这些数字仍然有多大的变化,在大多数情况下什么样的结果更快。在

这是合乎逻辑的,因为int()需要全局查找和函数调用(因此状态被推送和弹出):

^{pr2}$

LOAD_GLOBAL和{}操作码比LOAD_CONST和{}操作码慢;LOAD_CONST是一个简单的数组查找,LOAD_GLOBAL需要执行字典查找。在

int()绑定到一个本地名称可能会产生一个小的差别,使它再次获得边缘(因为它所做的工作比// 1floor division要少):

$ bin/python -mtimeit -n10000000 -s 'n = 1.345' 'int(n)'
10000000 loops, best of 3: 0.233 usec per loop
$ bin/python -mtimeit -n10000000 -s 'n = 1.345; int_=int' 'int_(n)'
10000000 loops, best of 3: 0.195 usec per loop
$ bin/python -mtimeit -n10000000 -s 'n = 1.345' 'n // 1'
10000000 loops, best of 3: 0.225 usec per loop

同样,你需要用1000万个循环来运行它,以一致地看到差异。在

也就是说,int(n)更显式,除非您在时间关键的循环中这样做,int(n)在可读性方面胜过n // 1。时间上的差异太小了,不足以让我们去弄清楚什么是值得的。在

虽然Martijn Pieters回答了您关于什么更快以及如何测试它的问题,但我觉得对于这样一个小规模的操作来说,速度并不是那么重要。正如Inbar Rose所说,我将使用int()来提高可读性。一般来说,在处理一些事情时,这种小小的可读性要重要得多;不过,一个普通的等式可能是例外。在

相关问题 更多 >