问题:在python中将float转换为int的有效方法是什么?

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

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

n = n // 1

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

解答

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()需要全局查找和函数调用(因此状态被推送和弹出):

>>> import dis
>>> def use_int(n):
...     return int(n)
... 
>>> def use_floordiv(n):
...     return n // 1
... 
>>> dis.dis(use_int)
  2           0 LOAD_GLOBAL              0 (int)
              3 LOAD_FAST                0 (n)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE        
>>> dis.dis(use_floordiv)
  2           0 LOAD_FAST                0 (n)
              3 LOAD_CONST               1 (1)
              6 BINARY_FLOOR_DIVIDE 
              7 RETURN_VALUE        

LOAD_GLOBALCALL_FUNCTION操作码比LOAD_CONSTBINARY_FLOOR_DIVIDE操作码慢;LOAD_CONST是一个简单的数组查找,LOAD_GLOBAL需要做一个字典查找。

int()绑定到本地名称可以产生微小的差异,再次赋予它优势(因为它比// 1楼层划分要做的工作更少):

$ 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。时间差异太小,以至于不得不计算// 1does 在这里的认知成本是值得的。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐