Найти - Пользователи
Полная версия: инклуд в начале файла или в функции?
Начало » Python для новичков » инклуд в начале файла или в функции?
1 2 3
Игнат
начав изучать питон, я увидел множество примеров, в которых инклудят модуль, или даже отдельную функцию лишь в месте её использования
например:

  def test():
from time import sleep
time.sleep(1)
пример может быть нерабочий, но не суть

до этого, в пхп и С/С++ я встречал лишь полный инклуд модуля в начале файла

так вот хочу узнать, оправдано ли подобное применение инклуда - лишь в необходимом методе, лишь необходимой функции
или это плохая практика? стоит ли к этому привыкать, или наоборот не стоит так инклудить?
Андрей Светлов
Привыкать - не нужно. Применять только в том случае, если иначе - никак.
regall
Андрей Светлов
Привыкать - не нужно. Применять только в том случае, если иначе - никак.
Иногда такое применяется, например, в написании тестов. Разработчики пирамиды сами рекомендуют внутри сетапа импортить необходимые модули.
Но это скорее относится к
Андрей Светлов
иначе - никак.
Игнат
спасибо. я тоже больше склонялся к тому, что не стоит
Александр Кошелев
Хочу отметить что это всё-таки не тупой инклюд как в других языках, а настоящий импорт некого имени в локальное пространство имен.
Андрей Светлов
Ага. С (возможным) исполнением кода модуля, обязательной блокировкой и прочими занятными вкусностями.
o7412369815963
Александр Кошелев
Хочу отметить что это всё-таки не тупой инклюд как в других языках, а настоящий импорт некого имени в локальное пространство имен.
в локальное пространство, но он не создает копию модуля, а использует ранее загруженную копию, и не исполняет её повторно (если это не стартовый модуль)

если функция с импортом очень часто вызывается, то для оптимизации можно импорт вынести наружу т.к. размещение в локальном пространстве занимает чуть времени (на моем компе около 0.000001 сек), хотя для питона это ничтожно.

в итоге минусов нет, а из плюсов - удобство. имхо.
Андрей Светлов
Блокировка берется всегда. И это главная (хоть и небольшая) затрата времени на импорт модуля, уже присутствующего в sys.modules.
Андрей Светлов
Да и сколько можно наступать на одни грабли?
Есть два метода:
- правильный, хороший и быстрый
- тоже работает в подавляющем большинстве случаев. Если повезет - вы никогда не увидите темную сторону.

Ваш выбор?
o7412369815963
Андрей Светлов
Блокировка берется всегда. И это главная (хоть и небольшая) затрата времени на импорт модуля, уже присутствующего в sys.modules.
def test():
import datetime
def test2():
pass

col = 1000000
from timeit import Timer
t = Timer("test()", "from __main__ import test")
t1 = t.timeit(number=col)
t = Timer("test2()", "from __main__ import test2")
t2 = t.timeit(number=col)
print t1,t2, (t1-t2)/col
1.08207988739 0.158288002014 9.23791885376e-07
она ничтожна, лучше я буду импорты держать под рукой, где мне удобно
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB