Python整数除法运算符vs math.floor

时间:2016-11-24 03:52:04

标签: python python-3.x

使用整数除法运算符而不是math.floor对性能有任何好处吗?

7 // 2

math.floor(7/2)

2 个答案:

答案 0 :(得分:6)

整数除法比math.floor函数调用快得多:

>>> import timeit
>>> timeit.timeit('7//2')
0.024671780910702337
>>> timeit.timeit('floor(7/2)', setup='from math import floor')
0.27053647879827736
>>> timeit.timeit('math.floor(7/2)', setup='import math')
0.3131167508719699

正如您在此反汇编中所看到的,使用math模块的floor功能(import mathmath.floorfrom math import floorfloor )涉及普通整数除法的额外查找和函数调用:

>>> import dis
>>> import math
>>> from math import floor
>>> def integer_division():
...     7//2
...
>>> def math_floor():
...     floor(7/2)
...
>>> def math_full_floor():
...     math.floor(7/2)
...
>>> dis.dis(integer_division)
  2           0 LOAD_CONST               3 (3)
              3 POP_TOP
              4 LOAD_CONST               0 (None)
              7 RETURN_VALUE
>>> dis.dis(math_floor)
  2           0 LOAD_GLOBAL              0 (floor)
              3 LOAD_CONST               3 (3.5)
              6 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
              9 POP_TOP
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE
>>> dis.dis(math_full_floor)
  2           0 LOAD_GLOBAL              0 (math)
              3 LOAD_ATTR                1 (floor)
              6 LOAD_CONST               3 (3.5)
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             12 POP_TOP
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE

答案 1 :(得分:0)

当然,在函数调用中会有一些开销,如果你这么做的话,你会看到速度的差异:

Run time for //: 12.940021991729736 sec
Run time for floor: 26.933987855911255 sec

这是我跑的代码:

from time import time
from math import floor

start_time = time()
for i in range(1, 10000):
    for j in range(1, 10000):
        result = i // j
print('Run time for //:', time() - start_time, 'sec')

start_time = time()
for i in range(1, 10000):
    for j in range(1, 10000):
        result = floor(i/j)
print('Run time for floor:', time() - start_time, 'sec')