Эффективный импорт модулей в представлениях Django - PullRequest
3 голосов
/ 13 июля 2009

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

Например, у меня есть такие представления, как,

admin_views.py
search_views.py
.
.

и из того, что я видел, каждый из них должен использовать HttpResponse или другие такие часто используемые модули. Более того, некоторые из них нуждаются в вещах, таких как BeautifulSoup, а другие - в других (md5, auth и др.).

Что я сделал при запуске проекта, так это сделал include_all.py, который содержал большую часть моего общего импорта, а затем добавил эти конкретные вещи в само представление . Итак, у меня было что-то вроде

admin_views.py

from include_all import *
... 
[list of specific module imports for admin]
...

search_views.py

from include_all import *
... 
[list of specific module imports for search]
...

С течением времени include_all стал файлом misc, в который было помещено все необходимое - в результате несколько представлений в итоге импортировали ненужные им модули.

Это повлияет на эффективность? Таким образом, python (django?) Импортирует все модули один раз и сохраняет / кэширует их так, что никакое другое представление, нуждающееся в них, не должно импортировать его снова? Или мой метод вызова этого длинного файла очень неэффективен - и я бы лучше придерживался индивидуального импорта этих модулей в каждом представлении?

Есть ли лучшие практики для такого рода вещей?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 13 июля 2009

Python сам гарантирует, что модуль загружается только один раз (если явно не вызывается reload, что здесь не так): после первого раза import этого модуля просто связывает свое имя непосредственно из sys.modules[themodulename]чрезвычайно быстрая операция.Таким образом, Django не нуждается в дальнейшей оптимизации, как и вы.

Лучшая практика - избегать from ... import * в производственном коде (делая его более понятным и удобным для сопровождения, откуда приходит каждое имя, облегчая тестирование и т.д.и т. д.) и импорт модулей «индивидуально», как вы выразились, именно там, где они нужны (возможно, связывая меньшее количество имен, которые могут сэкономить несколько микросекунд и определенно не потратить ни одного, но «явное лучше, чем неявное»- ясность, удобочитаемость, ремонтопригодность - главное в любом случае).

0 голосов
/ 13 июля 2009

Django не CGI (или PHP). Ваше приложение представляет собой один (или несколько) длительный процесс Python. Не имеет значения, сколько времени потребуется для запуска, каждый HTTP-запрос будет просто вызывать ваши (уже загруженные) функции просмотра.

0 голосов
/ 13 июля 2009

Полагаю, вы можете добавить часто используемые импортные файлы в свой файл __init__.py.

...