В некоторых случаях управляемый код может на самом деле быть быстрее , чем собственный код. Например, алгоритмы сборки "мусора" "метки-и-развертки" позволяют среды как JRE, или CLR для освобождения больших количеств недолгих (обычно) возражает в единственной передаче, где большинство объектов "кучи" C/C++ освобождено по одному.
От Википедия :
Для многих практических целей, allocation/deallocation-intensive алгоритмы, реализованные на собравших "мусор" языках, может на самом деле быть быстрее, чем их эквиваленты с помощью ручного выделения "кучи". Основная причина этого состоит в том, что сборщик "мусора" позволяет системе во время выполнения амортизировать операции выделения и освобождения потенциально выгодным способом.
Тем не менее я записал много C# и много C++, и я выполнил много сравнительных тестов. По моему опыту, C++ намного быстрее, чем C# двумя способами: (1) при взятии некоторого кода, который Вы написали в C#, портируйте его на C++, за которым собственный код ухаживает , чтобы быть быстрее. Насколько быстрее? Ну, это варьируется много, но весьма распространено видеть 100%-е улучшение скорости. (2) В некоторых случаях сборка "мусора" может в широком масштабе , замедляют управляемое приложение. CLR.NET делает ужасное задание с большой "кучей" (скажите>, 2 ГБ), и может закончить тем, что провел много времени в GC - даже в приложениях, которые имеют немногих - или даже нет - объекты промежуточных продолжительностей жизни.
, Конечно, в большинстве случаев что у меня есть encounted, управляемые языки достаточно быстры, намного, и компромисс обслуживания и кодирования для дополнительной производительности C++ является просто не хорошим.
Самый простой способ понять внутреннее устройство django - это прочитать книгу, специально написанную для этого.
Прочтите Pro Django . Сначала он дает вам хорошее глубокое понимание метапрограммирования и демонстрирует, как оно используется в моделях django для их динамического создания.
Он аналогичным образом имеет дело со многими другими концепциями python и тем, как django его использует.
Помимо чтения исходного кода, вот несколько статей, которые я недавно пометил и добавил в закладки:
Я обнаружил, что блог Джеймса Беннета является отличным источником информации о работе django. Его книгу Практические проекты Django также необходимо прочитать - хотя она не сосредоточена на внутренних компонентах, вы все равно узнаете, как работает django.
«Используйте источник, Люк». Прелесть ПО с открытым исходным кодом в том, что вы можете просматривать (и изменять) код самостоятельно.
Простое чтение исходного кода может быть немного утомительным, особенно потому, что верхняя часть немного сбивает с толку (как веб-сервер передает запрос коду Django). Я считаю, что хороший способ начать чтение кода - это установить точку останова отладчика в вашей функции просмотра:
def time(request):
import pdb; pdb.set_trace()
return HttpResponse(blah blah)
, затем нажать на свой URL. Когда отладчик прерывается в вашей точке останова, проверьте стек:
(Pdb) where
c:\abcxyzproject\django\core\management\commands\runserver.py(60)inner_run()
-> run(addr, int(port), handler)
c:\abcxyzproject\django\core\servers\basehttp.py(698)run()
-> httpd.serve_forever()
c:\python25\lib\socketserver.py(201)serve_forever()
-> self.handle_request()
c:\python25\lib\socketserver.py(222)handle_request()
-> self.process_request(request, client_address)
c:\python25\lib\socketserver.py(241)process_request()
-> self.finish_request(request, client_address)
c:\python25\lib\socketserver.py(254)finish_request()
-> self.RequestHandlerClass(request, client_address, self)
c:\abcxyzproject\django\core\servers\basehttp.py(560)__init__()
-> BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
c:\python25\lib\socketserver.py(522)__init__()
-> self.handle()
c:\abcxyzproject\django\core\servers\basehttp.py(605)handle()
-> handler.run(self.server.get_app())
c:\abcxyzproject\django\core\servers\basehttp.py(279)run()
-> self.result = application(self.environ, self.start_response)
c:\abcxyzproject\django\core\servers\basehttp.py(651)__call__()
-> return self.application(environ, start_response)
c:\abcxyzproject\django\core\handlers\wsgi.py(241)__call__()
-> response = self.get_response(request)
c:\abcxyzproject\django\core\handlers\base.py(92)get_response()
-> response = callback(request, *callback_args, **callback_kwargs)
> c:\abcxyzproject\abcxyz\helpers\views.py(118)time()
-> return HttpResponse(
(Pdb)
Теперь вы можете увидеть сводку пути от самой глубокой части веб-сервера до вашей функции просмотра. Используйте команду «вверх» для перемещения вверх по стеку и команду «список» и «печать» для проверки кода и переменных в этих кадрах стека.
Я сомневаюсь, что есть технические руководства по этой теме. Возможно, потребуется немного покопаться, но документация по API и исходный код - лучший выбор для получения надежной и актуальной информации.
В документации часто подробно рассказывается, когда это необходимо, чтобы объяснить, почему что-то работает. как они это делают. Одна из целей дизайна Django - максимально не полагаться на «магию». Однако всякий раз, когда Django делает что-то (например, расположение шаблонов в приложениях), он четко объясняет, почему в документации, и это всегда происходит предсказуемо.
На большинство ваших вопросов можно будет ответить, реализовав одну страницу .