it-swarm.com.ru

Python оптимизирует переменную, которая используется только в качестве возвращаемого значения?

Есть ли окончательная разница между следующими двумя фрагментами кода? Первый присваивает значение переменной в функции, а затем возвращает эту переменную. Вторая функция просто возвращает значение напрямую.

Python превращает их в эквивалентный байт-код? Один из них быстрее?

Случай 1:

def func():
    a = 42
    return a

Случай 2:

def func():
    return 42
105
Jayesh

Нет, это не так .

Компиляция в байт-код CPython проходит только через небольшой peephole optimizer , предназначенный для выполнения только основных оптимизаций (см. test_peepholer.py в наборе тестов для получения дополнительной информации об этих оптимизациях ).

Чтобы взглянуть на то, что на самом деле произойдет, используйте dis *, чтобы увидеть сгенерированные инструкции. Для первой функции, содержащей присвоение:

from dis import dis
dis(func)
  2           0 LOAD_CONST               1 (42)
              2 STORE_FAST               0 (a)

  3           4 LOAD_FAST                0 (a)
              6 RETURN_VALUE

Пока для второй функции:

dis(func2)
  2           0 LOAD_CONST               1 (42)
              2 RETURN_VALUE

В первой используются еще две (быстрые) инструкции: STORE_FAST и LOAD_FAST . Они быстро сохраняют значение в массиве fastlocals текущего фрейма выполнения. Затем в обоих случаях выполняется RETURN_VALUE. Таким образом, второй всегда немного быстрее из-за меньшего количества команд, необходимых для выполнения.

В общем, помните, что компилятор CPython консервативен в выполняемых им оптимизациях. Это не так, и не пытается быть таким же умным, как другие компиляторы (которые, как правило, также имеют гораздо больше информации для работы). Основная цель разработки, за исключением, очевидно, правильности, заключается в том, чтобы: а) сделать его простым и б) быть как можно более Swift при их компиляции, чтобы вы даже не заметили, что фаза компиляции существует.

В конце концов, вам не следует беспокоиться о небольших проблемах, подобных этой. Преимущество в скорости является крошечным, постоянным и, как правило, затмевается накладными расходами, вызванными тем, что интерпретируется Python.

* dis - это небольшой модуль Python, который разбирает ваш код, вы можете использовать его для просмотра байт-кода Python, который будет выполнять VM.

Примечание: Как также указано в комментарии @Jorn Vernee, это относится к реализации Python на CPython. Другие реализации могут делать более агрессивные оптимизации, если они того пожелают, а CPython - нет.

135
Jim Fasarakis Hilliard

Оба в основном одинаковы, за исключением того, что в первом случае объект 42 просто присваивается переменной с именем a или, другими словами, имена (т.е. a) ссылаются на значения (т.е. 42). Он не выполняет никаких технических заданий в том смысле, что никогда не копирует какие-либо данные.

В то время как returning, это именованное связывание a возвращается в первом случае, в то время как объект 42 возвращается во втором случае.

За дополнительной информацией обращайтесь эта замечательная статья Неда Батчелдера

3
kmario23