Переопределяются ли внутренние функции каждый раз, когда вызывается их родительская функция?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Переопределяются ли внутренние функции каждый раз, когда вызывается их родительская функция?

Сообщение Anonymous »

Я знаю, что функции в Python являются гражданами 1-го класса, то есть они являются объектами класса function, аналогично тому, как 5 является объектом класса int. Это означает, что в какой-то момент их жизни вызывается конструктор. Я ожидаю, что для большинства функций это произойдет, когда они определены (поскольку большинство функций предположительно определяются только один раз), поэтому мы платим цену создания только один раз, независимо от того, сколько раз мы ее используем.
А как насчет вложенных функций? Они переопределяются каждый раз, когда вызывается их родительский элемент. Означает ли это, что мы каждый раз переконструируем объект? Если да, то не является ли это крайне неэффективным? Разве частный метод (при условии, что родительская функция является методом) или другая функция не будет намного более эффективным? В этом обсуждении я игнорирую аргументы в пользу вложенности.

Я провожу простой эксперимент, который, похоже, подтверждает мой вышеупомянутый аргумент, поскольку внутренняя версия функции работает медленнее:

Код: Выделить всё

import time

def f(x, y):
def defined_inside(x, y):
return x + y
return defined_inside(x, y)

def defined_outside(x, y):
return x + y

def g(x, y):
return defined_outside(x, y)

start = time.time()
for i in range(10000000):
_ = f(3, 4)
end = time.time()

print("Using inner function it took {} seconds".format(end - start))

start = time.time()
for i in range(10000000):
_ = g(3, 4)
end = time.time()

print("Using outer function it took {} seconds".format(end - start))
Результаты:

Код: Выделить всё

Using inner function it took 2.494696855545044 seconds
Using outer function it took 1.8862690925598145 seconds
Бонусный вопрос: если вышеизложенное верно, как ситуация относится к компилируемым языкам, таким как Scala? Я полюбил вложение и функции высшего порядка, было бы ужасно, если бы этот трюк оказался таким неэффективным, как кажется.

Подробнее здесь: https://stackoverflow.com/questions/610 ... -is-called
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Элементы на карте переопределяются после использования map.find()
    Anonymous » » в форуме C++
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Элементы на карте переопределяются после использования map.find() [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Ширина и высота холста React-three/fiber переопределяются, и я не знаю, почему
    Anonymous » » в форуме CSS
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Когда я использую HashMap в Java, все мои значения переопределяются
    Anonymous » » в форуме JAVA
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Переменные CSS не переопределяются родителями
    Anonymous » » в форуме CSS
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»