Я думаю, все знают, что:
Python обращается к локальным переменным намного эффективнее, чем к глобальным переменным.
Хорошо, это правда:
oldlist = [str(i) for i in range(500)]
oldlist1 = [i for i in range(500)]
%%timeit
newlist = []
for word in oldlist:
newlist.append(word.upper())
10000 циклов, лучший из 3: 178 мкс на цикл
%%timeit
def func():
newlist = []
for word in oldlist:
newlist.append(word.upper())
return newlist
newlist = func()
10000 циклов, лучшее из 3: 93,2 мкс на цикл
К сожалению, похоже, что это не глобальное правило, а частный случай:
%%timeit
newlist = []
for nr in oldlist1:
newlist.append(nr * nr)
10000 циклов, лучшее из 3: 60,3 мкс на цикл
%%timeit
def func():
newlist = []
for nr in oldlist1:
newlist.append(nr * nr)
return newlist
newlist = func()
10000 циклов, лучшее из 3: 60,5 мкс на цикл
Как можно объяснить эти тесты?
append
(иupper
в этом отношении) и вызов псевдонимов внутри цикла, а не вызов их как атрибутов их родителей в каждой итерации. Эти поиски вполне могут быть более дорогостоящими, чем локальная/глобальная разница. Полученная вами дисперсия в 0,2 мкс не совсем статистически значима, учитывая, что общее значение равно 60. - person Silas Ray   schedule 19.11.2013