Область определения функции, заданной формулой корня четной степени. Алгебра 7-11 класс
12+
3 месяца назад
Математика от Баканчиковой164 подписчика
Алгебра 7-11 класс. Сегодня мы продолжим говорить об области определения функций (ООФ), заданных формулой. А конкретно мы расскажем Вам, как находить область определения функции, заданной формулой корня четной степени. Мы напомним Вам, что такое взаимообратные действия. Особо остановимся на взаимообратных действиях возведения в степень и извлечения корня, напомним компоненты этих действий, и покажем, как они проверяются друг другом. Напомним Вам, что является областью допустимых значений корня четной степени, и объясним, почему подкоренное выражение корня четной степени должно быть больше или равно нуля. Покажем, как находить область определения функции, заданной корнем четной степени, и грамотно оформлять решения упражнений. Дадим Вам правило нахождения области определения функции, заданной корнем четной степени, которое необходимо запомнить.
. Плохо ли определять локальный класс внутри функции в python?
спросил
Изменено 8 лет, 10 месяцев назад
Просмотрено 11 тысяч раз
Одна функция, над которой я работал не так давно, имела такую структуру:
def function(): класс Внутренний: #классные вещи #функциональная штука
Внутренний
всегда используется и нужен только внутри функции
, и он также не возвращается в конце функции. Это плохая идея определить локальный класс? Я много слышал о том, как это плохо для производительности, поскольку python должен перекомпилировать класс каждый раз, когда функция запускается, и поскольку производительность — это то, чего я стремлюсь достичь с помощью этой функции, я немного беспокоюсь об этом. .
- питон
- прицел
1
Кроме того, что это неэффективно, каждый Внутренний класс
является совершенно новым объектом, поэтому отдельные экземпляры никогда не будут принадлежать к одному и тому же классу, что несколько противоречит принципу классовой принадлежности:
В [4]: def factory( ): ...: класс Внутренний (объект): ...: проходят ...: возврат Внутренний ...: В [5]: i1 = factory()() В [6]: i2 = factory()() В [7]: i1.__class__ Выход[7]: __main__.Внутренний В [8]: i2.__class__ Выход[8]: __main__.Внутренний В [9]: i1.__class__ — это i2. __class__ Выход[9]: Ложь В [10]: isinstance(i1, i2.__class__) Выход[10]: Ложь
Это не проблема, если каждый экземпляр полностью независим, но об этом следует знать.
2
Определение локального класса в вашем случае кажется бесполезным. Я бы сделал это , если я сделал хочу вернуть его. Есть некоторые недостатки при определении локальных классов:
- Читабельность: либо класс действительно тривиален, либо функция неизбежно становится довольно длинной, и ее логика теряется в объявлении класса. Также у вас есть дополнительный уровень отступа, который может повредить читабельности, если у вас где-то есть вложенные циклы
- Производительность: класс будет перестраиваться при каждом вызове функции. Обычно это не занимает много времени, но стоит немного. Если функция, которую вы выполняете, работает быстро, эти затраты могут быть значительными.
Есть также некоторые преимущества определения локального класса:
- Локальность: вы, как правило, уверены, что класс не будет использоваться вне функции так, как вы не ожидали
- Производительность: поиск локальной переменной выполняется значительно быстрее, чем поиск глобальной переменной. Если вы создадите большое количество экземпляров, это может повысить производительность по сравнению с использованием глобального класса. Однако этому преимуществу очень легко противостоять с помощью аргументов по умолчанию/локальных переменных.
Мое предложение состояло бы в том, чтобы просто определить класс глобально и, если он должен быть частным, использовать имя, начинающееся с подчеркивания, например _MyClass
, так как это соглашение используется для обозначения частных элементов.
Некоторые тайминги, чтобы дать представление об изменениях в производительности:
В [1]: class _Out(object): ...: тест защиты (сам): ...: для _ в диапазоне (10): ...: проходят ...: В [2]: def function_out(n): ...: для _ в диапазоне (n): ...: _Out().test() ...: В [3]: def function_in(n): ...: класс Внутренний (объект): ...: тест защиты (сам): ...: для _ в диапазоне (10): ...: проходят . ..: для _ в диапазоне (n): ...: Внутренний (). Тест () ...: В [4]: def function_mixed(n, cls=_Out): ...: # использование значения по умолчанию для доступа к глобальному классу через локальную переменную ...: для _ в диапазоне (n): ...: клс().тест() ...: В [5]: %timeit function_out(1000) 1000 петель, лучшая из 3: 602 мкс на петлю В [6]: %timeit function_in(1000) 1000 петель, лучшее из 3: 621 мкс на петлю В [7]: %timeit function_mixed(1000) 1000 петель, лучшая из 3: 590 мкс за цикл В [8]: %timeit function_out(100000) 10 циклов, лучшее из 3: 59,9 мс на цикл В [9]: %timeit function_in(100000) 10 циклов, лучший из 3: 60,2 мс на цикл В [10]: %timeit function_mixed(100000) 10 циклов, лучшее из 3: 58,4 мс на цикл В [11]: %timeit function_out(10) 100000 петель, лучшее из 3: 6,52 мкс на петлю В [12]: %timeit function_in(10) 10000 петель, лучшая из 3: 57,8 мкс на петлю В [13]: %timeit function_mixed(10) 100000 петель, лучшее из 3: 6,33 мкс на петлю
Обратите внимание, как при большом количестве итераций function_in
и function_out
выполняются примерно одинаковое время, а при небольшом количестве итераций function_in
примерно в 10 раз медленнее.
Не столько перекомпилировать, сколько переоценить. Одним из простых тестов является создание такого модуля:
class Root(object): распечатать("корень") определение make_inner(): класс Внутренний (объект): печать ("внутренний") вернуть внутренний () распечатать("импорт")
Затем попробуйте запустить этот
>>> импортировать внутренний корень импорт >>> импортировать внутренний >>> внутренний.make_inner() внутренний>>> внутренний.make_inner() внутренний >>> >>> перезагрузить (внутренний) корень импорт <модуль 'внутренний' из 'inner.pyc'>
Как видите, определение класса выполняется каждый раз, когда вызывается make_inner
. Это может быть проблемой, если эта конкретная функция вызывается внутри цикла, например, это почти похоже на перезагрузку определения класса, но на самом деле это не так.
Зарегистрируйтесь или войдите в систему
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается