Почему назначение функции в качестве переменной быстрее в Python - PullRequest
0 голосов
/ 06 сентября 2018

Сегодня я наблюдал интересное поведение при использовании Python.

def f():
    ls1 = []
    for x in range(1000000):
        ls1.append(x)
%timeit f()
77.2 ms ± 1.83 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

И проверил вторую функцию.

def f2():
    ls1 = []
    lsa = ls1.append
    for x in range(1000000):
        lsa(x)        
%timeit f2()
56 ms ± 566 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Назначение добавления к переменной было быстрее, чем использование добавления внутри цикла.

Почему вторая функция быстрее?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Python - это динамический язык. Поиск атрибутов сравним с поиском в стиле dict, поэтому в первом сценарии сначала выполняется поиск ls1 в локальной области, а затем поиск append в ls1 -объекте каждой из 1000000 итераций. Во втором сценарии вы просматриваете append на ls1 только один раз, а затем 1 миллион итераций, где вы просматриваете lsa в локальной области действия

0 голосов
/ 06 сентября 2018

Поскольку во второй функции у вас уже есть ссылка на метод, и вы можете вызывать ее непосредственно на каждой итерации, тогда как в первой функции она должна сначала найти метод append объекта ls1, сначала в каждую итерацию перед вызовом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...