2016-11-24 4 views

ответ

4

Integer div -концепция гораздо быстрее, чем вызов 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 

Как вы можете видеть с этой разборкой, используя floor функцию math модуля (с import math и math.floor или from math import floor и floor) привлекать лишние преобразования и вызовы функций по равнине целочисленное деление:

>>> 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 
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') 
Смежные вопросы