Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 9, 2011 09:56:28

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

инклуд в начале файла или в функции?

начав изучать питон, я увидел множество примеров, в которых инклудят модуль, или даже отдельную функцию лишь в месте её использования
например:

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

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

так вот хочу узнать, оправдано ли подобное применение инклуда - лишь в необходимом методе, лишь необходимой функции
или это плохая практика? стоит ли к этому привыкать, или наоборот не стоит так инклудить?



Отредактировано (Фев. 9, 2011 09:56:53)

Офлайн

#2 Фев. 9, 2011 09:58:29

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

инклуд в начале файла или в функции?

Привыкать - не нужно. Применять только в том случае, если иначе - никак.



Офлайн

#3 Фев. 9, 2011 10:03:52

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

инклуд в начале файла или в функции?

Андрей Светлов
Привыкать - не нужно. Применять только в том случае, если иначе - никак.
Иногда такое применяется, например, в написании тестов. Разработчики пирамиды сами рекомендуют внутри сетапа импортить необходимые модули.
Но это скорее относится к
Андрей Светлов
иначе - никак.



Офлайн

#4 Фев. 9, 2011 10:29:57

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

инклуд в начале файла или в функции?

спасибо. я тоже больше склонялся к тому, что не стоит



Офлайн

#5 Фев. 9, 2011 12:29:38

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

инклуд в начале файла или в функции?

Хочу отметить что это всё-таки не тупой инклюд как в других языках, а настоящий импорт некого имени в локальное пространство имен.



Офлайн

#6 Фев. 9, 2011 12:33:41

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

инклуд в начале файла или в функции?

Ага. С (возможным) исполнением кода модуля, обязательной блокировкой и прочими занятными вкусностями.



Офлайн

#7 Фев. 9, 2011 19:39:55

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

инклуд в начале файла или в функции?

Александр Кошелев
Хочу отметить что это всё-таки не тупой инклюд как в других языках, а настоящий импорт некого имени в локальное пространство имен.
в локальное пространство, но он не создает копию модуля, а использует ранее загруженную копию, и не исполняет её повторно (если это не стартовый модуль)

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

в итоге минусов нет, а из плюсов - удобство. имхо.

Офлайн

#8 Фев. 9, 2011 19:43:21

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

инклуд в начале файла или в функции?

Блокировка берется всегда. И это главная (хоть и небольшая) затрата времени на импорт модуля, уже присутствующего в sys.modules.



Офлайн

#9 Фев. 9, 2011 19:49:09

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

инклуд в начале файла или в функции?

Да и сколько можно наступать на одни грабли?
Есть два метода:
- правильный, хороший и быстрый
- тоже работает в подавляющем большинстве случаев. Если повезет - вы никогда не увидите темную сторону.

Ваш выбор?



Офлайн

#10 Фев. 9, 2011 19:51:52

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

инклуд в начале файла или в функции?

Андрей Светлов
Блокировка берется всегда. И это главная (хоть и небольшая) затрата времени на импорт модуля, уже присутствующего в 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
она ничтожна, лучше я буду импорты держать под рукой, где мне удобно

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version