在python中将float转换为int的有效方法是什么?
问题:在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
·
问题:在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_GLOBAL
和CALL_FUNCTION
操作码比LOAD_CONST
和BINARY_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
。时间差异太小,以至于不得不计算// 1
does 在这里的认知成本是值得的。
更多推荐
目录
所有评论(0)