Почему процедура намного быстрее, если ее поместить в функцию? - PullRequest
8 голосов
/ 11 августа 2011

Вот что я сделал, я создал 2 процедуры, одну в функции и одну в самом файле python. Тот, что находится в самом файле python, работает почти в 2 раза медленнее, даже если он точно такой же. ЗАЧЕМ ?

Ниже приведен пример с двумя процедурами, которые являются просто циклами элемента P

У меня есть следующий файл python:

from time import *
P=1000000 #range of the 2 loops

def loop(N):
        for k in range(N):
                continue

start=time()
loop(P)
stop1=time()
for k in range(P):
            continue
stop2=time()
print "time with function ",stop1-start
print "time without function ",stop2-stop1

Вот что я получаю (я попробовал это с тысячей сэмплов, и результат следующий):

time with function  0.0950000286102
time without function  0.15700006485

с xrange вместо диапазона я получаю:

time with function  0.0460000038147
time without function  0.107999843597

Так что для построения списка используется 0,05 секунды

Я знаю, что это может быть бесполезный вопрос, но если кто-то знает, почему это происходит намного быстрее, я был бы рад узнать

1 Ответ

14 голосов
/ 11 августа 2011

Единственное существенное отличие состоит в том, что версия в функции обновляет только локальную переменную для этой функции, тогда как версия, не входящая в функцию, обновляет глобальную переменную k.

Как уже упоминалось здесь :

Последнее доступное нам ускорение для не-картовой версии цикла for заключается в использовании локальных переменных везде, где это возможно. Если приведенный выше цикл приведен как функция, append и upper становятся локальными переменными. Python обращается к локальным переменным гораздо эффективнее, чем к глобальным переменным.

...