Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение TurboGears и Django, Читаем, обсуждаем, тестируем 
V
    Опции темы
alrond
Дата 25.8.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



А какие преимущества у TurboGears против Django?
можно на пальцах, хочется именно личное мнение  smile 
PM MAIL   Вверх
pythonwin
Дата 25.8.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Максим Ищенко о TG

TurboGears: разрабатываем веб-приложения на Python
Цитата

TurboGears: разрабатываем веб-приложения на Python
Грудень 16th, 2005 by Max
Опубліковано в: Технологии, Инструменты, Web

Иван Сагалаев с увлечением взялся рассказывать о Django - среде для разработки веб-приложений на Питоне. Подстегнутые популярностью Ruby on Rails, Python разработчики, похоже, кинулись готовить достойный ответ. Точнее, ответы. smile

Я тоже определился с выбором, только в пользу TurboGears. Почему не django или что-то другое?

Во-первых, разработчик(и) TurboGears не стали изобретать велосипед, а взяли готовые, зарекомендовавшие себя компоненты: MochiKit, Kid, CherryPy, SQLObject. Это дает не только внушительный объем функциональности, но и доступ к сложившимся вокруг этих проектов коммьюнити. Во-вторых, мне понравился исходный код, организация проект и “первая производная” (а.к.а вектор развития). Ну и наконец - не хочу повторяться. Пусть Иван Салагаев описывает Django, а я буду писать о TurboGears (если это кому-то интересно).

ЗЫ: К “промышленному” использованию TurboGears пока не готов, ИМО, так что если вы ищите готовую среду для разработки веб-проекта с конкретными сроками лучше посмотрите что-то другое. Ruby on Rails, к примеру. smile 



Иван Сагалаев о Django

Django

Цитата

Давно хочу написать про Django. В итоге, вот, сподвигся, прочитав песню о Ruby и Rails на Julik Live.

Многим людям, особенно занимающимся программированием, дизайном и прочей деятельностью, связанной с hi-tech творчеством, думаю, знакомо ощущение, что ты в этом мире катастрофически не успеваешь за временем. Что, в общем-то, и понятно: благодаря интернету творческим людям делиться интересными мыслями становится крайне просто. Усваивать такое количество информации одному человеку почти нереально, поэтому все мы, наверное, осознанно или нет, выработали какие-то механизмы фильтрации, по поводу чего можно просто подумать “да, прикольно…”, а чем заинтересоваться поподробнее.

У меня в качестве такого сильного фильтрующего признака, как я недавно осознал, выступает рекомендация чего-либо со стороны блогеров, которых я считаю большими профессионалами в своей области. Поэтому когда уважаемый мной Саймон Виллисон написал о новом веб-фреймворке Django, я таки пошел читать, что это такое.

“Таки” в словах “таки пошел” означает, что я, в общем-то, не особенно западаю на объявления о новых веб-фреймворках. Действительно их существует просто дикое количество. Такое ощущение, что каждый веб-разработчик считает своим святым предназначением выдрать куски кода из какого-то своего очередного сайта и объявить их тулкитом, фреймворком, CMS или чем там еще… Документация не прилагается, рефакторинг — “планируется”. Нет, безусловно есть и хорошие, и даже, наверное, очень много. Но обилие плохих поделок сильно снижает вероятность благополучного исхода знакомства.

Но с Django у меня вышло иначе. Я не только про него прочитал, но и решил после этого даже с ним поработать! Что еще более невероятно, я, который может с легкостью рассказать, чем я по уши загружен на ближайшее десятилетие, все же начал с ним работать. И уж совсем из области фантастики то, что все не остановилось на уровне прототипа в моем ноутбуке, а движется к завершению в виде коммерческого проекта фотосервиса (не спрашивайте подробней, что за проект: не могу говорить).
Ruby on Rails

Если вы занимаетесь web-разработкой, умеете пользоваться интернетом и не считаете, что ASP.NET или PHP — самое последнее слово в веб-технологиях, то вы слышали о “Ruby on Rails“. Трудно было не слышать, потому что восторгов и отзывов по поводу того, как просто, быстро и без потери масштабируемости можно писать на RoR веб-приложения, в сети — море.

Меня огорчало только одно: какое-то время назад, решив поменять ориентацию, я заинтересовался не Ruby, а Python’ом. И возможно, я уже слишком “старый” по программерским меркам, поэтому начинать учить другой язык, не разобравшись с первым, мне стало лениво. Да, в общем-то, и смысла особенного не видел, потому что Питон, как язык, очень мне нравится.

Но так или иначе, не успев даже как следует обидеться на судьбу за то, что соседняя очередь опять идет быстрее, я читаю про Django, о котором, как только он появился, говорят не иначе как “очень похоже по идеологии на RoR” и “как RoR, только для Питона”. Это, после совета авторитетов, стало вторым побуждающим фактором к скачиванию.

Вообще, напрямую сравнивать оба фреймворка я не возьмусь, потому что Rails я не использовал, а только видел знаменитый скринкаст на сайте и читал отзывы и сравнения. Однако вот краткая выжимка того, что я знаю об отличиях Rails и Django:

    *

      Rails изначально вырос из веб-приложения, системы управления “Basecamp“, а Django — из CMS для издательской компании “World Online“. Отсюда некоторые отличия в вещах, которые у той и другой системы получается лучше всего. Как сказал создатель Rails: “Rails больше подходит для создания приложений с добавлением статических страниц, а Django — для контент сайтов с динамическими функциями”.

      Взять, например, такую деталь: время жизни пользовательской сессии в Django стоит по умолчанию на 2 недели и считается от первого входа пользователя. Это не очень удобно для приложений, где сеансы короткие (порядка минут-часов), и время “протухания” считают обычно от последнего обращения.

      Однако надо учесть, что обе системы активно развиваются, и потихоньку приобретают все нужные черты, которых не имели раньше. Та же поддержка коротких живых сессий в Django уже есть (не без моего участия :-) )
    *

      В Django модель данных вашего приложения описывается в Питоне классами, и по ней генерится схема БД. А раз схема определяется в языке и от БД не зависит, это значит, что можно легко перейти на другую БД (например если вы писали что-то с Postgres’ом, а у юзера вдруг оказался только MySQL). Еще лично мне это очень нравится из-за того, что я не в состоянии запомнить, как пишутся все эти ALTER TABLE, которые еще и разные для разных БД. Хотя это и решается визуальными конструкторами.

      RoR делает по-другому: там сначала пишется схема БД, а по ней генерируется скелет приложения.

      Другими словами, и тот, и другой фреймворк используют свои ORM-решения для доступа к БД, которые, тем не менее, не избавляют от ручной работы по синхронизации объектной модели и модели БД.

Философия Django

Вот где Django сходится с Rails, так это в идеологии (от чего, собственно, их все и сравнивают). Вот основные принципы Django.

    *

      Принцип DRY — Don’t Repeat Yourself. Означает, что по возможности надо стараться исключать дублирование уже введенного в систему знания. Самый простой пример, если вы описали тип поля в таблице, вам уже не нужно писать исключительную по своему творческому заряду вещь:

      if тип поля EMail:
        проверить, что передан EMail
      elif тип поля Integer:
        проверить, что передан Integer
      ...

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

      Реализация идеологии MVC. Очень удачная и практичная идеология. В Django правда, она реализована не совсем в классическом варианте. Например то, что обычно называется Controller, там вырождено в файл соответствия URL’ов обрабатывающим функциям, которые лежат в уровне View. Поэтому часто говорят, что Django просто переназвали Controller во View, а View — в шаблоны.
    *

      Разделение фреймворка на максимально независимые компоненты: так называемая “слабая связанность”. Тоже очень правильная идеология. Шаблоны, обработчики и модель почти не завязаны друг на друга. Модель ничего не знает о такой вещи, как HTTP-запрос, а из шаблона нельзя даже случайно изменить данные.
    *

      Отказ от завязывания шаблонов на язык программирования. Когда шаблон представляет собой смесь HTML’а и кода серверного языка, то очень быстро это приводит к тому, что в шаблон проникает довольно много логики, которой неплохо бы быть на уровне приложения. Что в свою очередь ведет к тому, что все это сложно поддерживать (примерно как суп вилкой есть). В Django язык шаблона вообще не связан с Питоном, а шаблонная логика намеренно очень ограничена. Например в операторе {% if %} можно проверить только логическую истинность объекта, а произвольное условие типа “равна ли длина списка пяти” — не допускается. Еще одно свойство шаблонной системы — безопасность. Можно обращаться не к любым методам, а только к тем, которые не меняют сами объекты. Поэтому шаблон спокойно можно отдать на редактирование кому-то другому, зная, что он ничего не сломает.
    *

      Красивые URL’ы. Это одна из тех вещей, про которую все знают, что это хорошо, но тем не менее обычно откладывают, потому что на функциональность сайта это не влияет, а начальство требует все новых возможностей от продукта, красота никого не трогает. В Django вы просто не сможете породить конструкции типа “index.php?func=user&subfunc=add&PHPSESSIONID=…..”. У вас есть файл, в котором просто пишется список всех видов URL’ов, которые привзяываются к своим обрабатывающим функциям. Причем изменяемые части URL’ов (id’шки там всякие) передаются в обработчики в виде обычных параметров функций, их не надо доставать из какой-нибудь коллекции.

И еще там есть много вкусных вещей, которые заставляют вас, читая, кивать головой, думая “ага, правильно!” :-).
Less code

Центральная же идея фреймворка — быстрая разработка с маленьким количеством кода. Все нацелено на то, чтобы большую часть времени программист занимался не настройкой фреймворка, а написанием кода своего приложения.

Для достижения этого многие вещи делаются без лишних указаний в настройках, а по соглашению. Скажем, если надо при генерации схемы БД заполнять ее какими-то тестовыми данными, нужно просто оставить в проекте файл оговоренного названия с SQL-скриптом, не надо нигде прописывать выполнение этого кода.

Кроме того, Django поставляется с немалым количеством уже написанных базовых вещей, которые в том или ином виде присутствуют почти в любом современном веб-приложении:

    * Сессии. Вы просто подключаете в приложение нужный модуль и у вас в каждом запросе появляется request.session, в которую можно класть любые данные. Они, естественно, разные для каждого юзера.
    * Авторизация . Вообще чумовая штука: регистрация, авторизация, система прав на объекты вашей модели данных, генерация паролей, рассылка сообщений юзерам по EMail.
    * Кеширование. Для того, чтобы не обращаться в базу каждый раз, когда требуются редко меняющиеся данные, можно вывод закешировать. Можно целиком весь сайт, можно отдельные страницы, можно вообще произвольные данные. Причем у системы кеша еще и несколько возможных вариантов, где этот кеш хранить: в памяти, в memcached (не знаю, что это, но говорят, известная штука), в директории на диске, в таблице БД…
    * И куча еще: синдикация, GZip, conditional get, редиректы, статические информационные страницы, валидация форм и т.д.

Причем эти базовые вещи еще и легко расширяются. Например, если нужны нестандартные поля для таблички юзеров, то с помощью некоторого подобия наследования можно переделать стандартную табличку, и система авторизации будет использовать ее. Также сильно помогает, что исходники всего фреймворка открыты, и можно в точности увидеть, как все работает, и как это можно поменять или расширить.

Но пожалуй, самая “презентационная” особенность Django, ускоряющая разработку сайта — админка. Все, кто пишет веб-приложения, знают сколько времени может отнять написание рабочего места для человека, который будет рулить наполнением табличек. А если это еще и на права завязано…

В Django для этого писать код вообще не надо. Надо только указать, какие ваши объекты вы хотите видеть в административном интерфейсе и все, Django автоматически формирует интерфейс, который мало того, что работает, так еще и выглядит классно.

Причем дальше, когда уже все работает, можно при желании заняться вылизыванием: сливать экраны редактирования объектов и подобъектов, добавлять поиски, разбивку на страницы по датам и т.д.
Python

Не последнюю роль в реализации принципа “меньше кода — больше денег” играет язык программирования.

Питон — один из модных объектно-ориентированных динамических языков, который отличается от классических (Паскаль, Си, Си++) в первую очередь тем, что он современный. А значит, в нем исправлены многие вещи, которые были сделаны в тех языках плохо. Кроме того, многие приемы программирования (паттерны), которые сложились за долгое время, добавлены прямо в синтаксис языка.

Причем все это сделано не сумбурно, а с наличием четко выверенной позиции, что делает программирование несказанно более простым и предсказуемым. Одни из главных принципов Питона: “явное лучше неявного” и “должен быть только один очевидный способ делать одну вещь”. Поэтому он и не превращается в Perl, который известен как “write-only language”.

Django использует возможности Питона на всю катушку. Например взможность по объекту узнать всю внутреннюю структуру класса, какие у него методы и свойства, очень полезна для реализации принципа DRY. Именно из-за этого возможно строить модель данных по описанным классам и обвешивать объекты этих классов всякими полезными методами. Например, если вы определили класс Person с атрибутом picture, в котором лежит фотография человека, то Django сделает ему удобные методы get_picture_url(), get_picture_filename().

Буквально недавно я написал один кусочек, которым хочу поделиться в качестве примера совместной работы Django и Питона.

Есть у меня список объектов — уменьшенные копии фотографий — которые я передаю в шаблон. Мне понадобилась оптимизация, чтобы некоторые thumbnail’ы нужно было не передавать полностью, а использовать только их id.

Вот тут начинает работать Питоновская динамика. В список thumbnails я могу класть не только экземпляры класса thumbnail, а вообще говоря, все что угодно. И вместо целиковых thumbnail’ов я могу положить там где надо заглушки с id:

thumbnails=[]                  #создается пустой список
for t in get_thumbnail_list(): #получаются thumbnail'ы из БД
  if <какое-то условие>:
    thumbnails.append(t)
  else:
    thumbnails.append({'id':t.id})  #заглушка в виде стандартного dict

dict - это тип данных в Питоне, который в PHP известен как “массив”, в Perl - как “хеш”, а в C++ ближайшим аналогом является STL’ный “map”.

В самом шаблоне ко всем элементам списка я обращаюсь одинаково: {{thumbnail.id}}, даже несмотря на то, что это по природе совсем разные объекты.

Работает это так. Когда Django’вский шаблон встречает конструкцию {{thumbnail.id}} он делает несколько проверок: 1. Если объект thumbnail - коллекция, и у нее есть ключик ‘id’, достается значение по ключу. 1. Если у объекта thumbnail есть свойство id - берется его значение. 1. Если у объекта thumbnail есть метод id(), то он вызывается и берется его результат. 1. Если бы вместо “id” была цифра, то Django проверил бы еще и элемент списка с этим индексом.

Вкусно, да? :-). В итоге шаблон получается гораздо более читаемым, чем во многих других шаблонных системах.

Дальше — больше. Мне понадобилось, чтобы в списке каждый thumbnail сопровождался еще одним параметром — признаком unchanged. И если добавить в заглушку еще один ключик проблем не представляет (будет {'id':t.id,'unchanged':False}), то у объекта thumbnail никакого такого свойства “unchanged” нет.

В каком-нибудь языке со статической типизацией надо было бы заменить все объекты в списке на некую обертку с дополнительным полем:

ThumbnailWrapper={
  unchanged:bool;
  object:Thumbnail;
}

… и заменить все обращения к элементам списка с просто thumbnail.id на thumbnail.object.id.

В Питоне же можно прямо к существующему объекту просто навесить новое свойство простым присваиванием:

thumbnail.unchanged=True   # у объекта создается новое свойство

Красота!
О стабильности кода

Пока еще Django находится в стадии активной доводки, и еще не дожил до версии 1.0. А это в свою очредь означает, что надо быть готовым к тому, что довольно часто разработчики ломают старые API и подходы в пользу более лучших. При этом ведут документик по несовместимым изменениям.

Это, на самом деле, резко увеличивает фан, и почти не добавляет головной боли, потому что изменения маленькие и логичные. Но если для вас важна стабильность кода, то пока переводить клиентские сервисы на Django я бы все же не советовал.
В заключении

Должен сказать, что пока я это все писал, меня довольно часто уносило вглубь по многим вопросам, и я потом стирал все целыми абзацами. Моей главной целью было дать представление о фреймворке и заинтересовать вас самих на него смотреть. Для этого, кстати, совершенно не обязательно иметь какой-нибудь мегахостинг, всю катавасию можно завести у себя на машине, причем и на Windows, и на Маке, и на других юниксах, конечно.

Планирую писать про Django и дальше. Спрашивайте, что вам было бы интересно.


Добавлено @ 17:52 
Matthew Russell о TG (англ.)
What Is TurboGears (Hint: Python-Based Framework for Rapid Web Development)

Цитата

urboGears
    TurboGears is a Python-based framework that enables you to quickly build database-driven, ready-to-extend web applications. TurboGears can be developed on Windows, Linux, and Mac OS X. It allows you to seamlessly provide HTML or an API for JavaScript to work with, gives your designers room to work with any XHTML tool for building layouts, and enables you to use your database without writing SQL. TurboGears is free and released under liberal open source licenses for both non-commercial and commercial projects.

In this article

   1. It's Kind of Like Rails -- But with Python
   2. Similarities with Rails
   3. A Quick Closer Look at the Stack
   4. An Interview with the Creator of TurboGears
   5. The TurboGears Are Spinning Fast

Rails sure has stirred up a lot of buzz lately (and rightly so), but now there's another great way to develop your next web app. It's lean, it's mean, it's easy to configure and use, and it shouldn't be a surprise that it's based on Python, a language that truly makes the common cases fast and easy. Meet TurboGears -- the powerful new mega-framework that's designed specifically to help you create your next great web app as quickly as possible. And the best part is that you're going to have a lot of fun doing it.
&lt;A TARGET="_blank" HREF="http://ad.doubleclick.net/click%3Bh=v7/344c/3/0/%2a/a%3B32503746%3B0-0%3B0%3B12453998%3B4252-336/280%3B16834366/16852261/1%3B%3B%7Efdr%3D38627655%3B0-0%3B0%3B13513799%3B4252-336/280%3B17184607/17202502/1%3B%3B%7Efdr%3D25171877%3B0-0%3B0%3B10905964%3B4252-336/280%3B13990008/14007904/1%3B%3B%7Esscs%3D%3fhttp://seeker.dice.com/jobsearch/gentwo/index.jsp "&gt;&lt;IMG SRC="http://m1.2mdn.net/982522/Dice_Testimonial_336x280_a-85.gif" BORDER=0&gt;&lt;/A&gt;
It's Kind of Like Rails -- But with Python
TurboGears stack The TurboGears stack. Image courtesy of Blazing Things.

TurboGears puts together some of the best Pythonic frameworks available to bring you a mega-framework similar to Rails that makes it easy to get a lot of work done in very little time. It's a "full-stack" approach that covers the entire gamut of details involved with traditional web applications. Everything from slapping data down on the disk with SQLObject all the way up to providing a slick AJAX-based user experience with the help of MochiKit, the best JavaScript library you're going to find out there, is included in the package.

Sandwiched in between is CherryPy, the web application framework that makes cranking out dynamic content as easy as writing Python, and Kid, a powerful XML-based templating system. Each piece of the stack does what it does extremely well, and the overall effect of combining the pieces together certainly seems to produce an effect that's greater than the sum of the individual parts. Oh, and by the way, all of those projects are released under liberal open source licenses, as is TurboGears itself. Sound too good to be true? Let's take a closer look.
Similarities with Rails

Perhaps the most important similarity to Rails is the ultra-productivity that you can experience with TurboGears. Do you know of many other frameworks you can use to create a Wiki in only 20 minutes? (Didn't think so.) As we'll see, this productivity isn't the result of rocket science or some kind of profound inner truth. Rather, it's just the natural effect of combining nicely designed software components in a solid model-view-controller architecture.

Notably, each piece of the stack is based on Python, a powerful yet easy-to-use language that heralds itself as making development as simple and quick as possible. Python and Ruby are obviously different languages, but they share a lot of similarities with regard to the perks that they bring to the development cycle. Google's director of search quality, Peter Norvig, recently said, "Python has been an important part of Google since the beginning, and remains so as the system grows and evolves. Today dozens of Google engineers use Python, and we're looking for more people with skills in this language." Those are inspiring words to hear from a company that obviously has been doing something right.

Another similarity between TurboGears and Rails is that it takes the same basic model-view-controller approach to web development that separates your underlying data and logic from the actual presentation of your content. Not only is code that's written in this way naturally modular, it's also fairly easy to troubleshoot and maintain -- significant factors to consider regarding the life cycle of any project. The model-view-controller approach is the same great methodology that just about any mildly complex application for your Mac is designed with. Examples might not prove anything, but it's hard not to notice how successful Apple has been in leveraging this approach to dish out some pretty amazing applications these last few years.

A Quick Closer Look at the Stack

At the bottom layer of the stack is SQLObject. Essentially, this little marvel removes much of the burden of writing your own SQL queries, and instead, allows you to focus much more of your attention on the modeling process. The basic idea is that classes are flattened into tables and the attributes of the classes become table columns. An especially interesting property of SQLObject is that it tries to be as agnostic as possible with respect to the specific SQL database that you use underneath, so you could transition amongst SQLite and PostgreSQL without hassle.

Click here to find out more!

Here's what's becoming the classic example for illustrating how easy it is to use SQLObject:

from sqlobject import *
from datetime import datetime
        
class Person(SQLObject):

    firstName = StringCol(length=100)
    middleInitial = StringCol(length=1, default=None)
    lastName = StringCol(length=100)
    lastContact = DateTimeCol(default=datetime.now)

That code looks remarkably similar to the following SQL query:

CREATE TABLE person (
         id INT PRIMARY KEY AUTO_INCREMENT,
         first_name VARCHAR(100) NOT NULL,
         middle_initial CHAR(1),
         last_name VARCHAR(100) NOT NULL,
         last_contact TIMESTAMP NOT NULL
     );

Sitting just above the SQLObject layer of the stack is CherryPy. If you've ever done any kind of server-side scripting before with a technology like servlets, you'll find CherryPy to be a very easy way to pump out dynamic content. Here's the classic "Hello World" where you can optionally set the query string parameter who in the URL to display something in the place of "World."

import cherrypy

class MyRoot:
    
    @cherrypy.expose()
    def index(self, who="World"):
        return "Hello, %s!" % (who)

It really doesn't get much simpler than that, and if you're already the least bit Python-savvy, you'll be able to surprise yourself with what you can get done with CherryPy. The performance isn't bad either; the server itself is capable of serving several hundred requests a second, which means that your performance is going to depend mostly on your application's specific code.

Kid is the next layer of the stack and provides a robust XML templating system that makes it easy to separate the content from the presentation of your pages, in addition to simplifying mundane tasks like building tables. For example, take a look at the following code to build a table using Kid:

<table>
    <tr py:for="gear in turbogears">
        <td><span py:content="gear.name">TurboGears</span></td>
    </tr>
</table>

That's easy enough. As you can see, templating engines fill the niche of transforming data that's churned out by an application into a nice presentable format via insertion into a spot template itself. Just think about how much easier that approach makes it to maintain complex hierarchies of documents on sites like eBay and Amazon.

Of course, CSS still styles the actual content that's pushed into the template, but the template itself provides the overall structure for the document. Templating systems provide one of those highly sought-after, win-win situations that allow designers to do what they do best (presentation) and developers to do what they do best (deliver content).

Finally, MochiKit tops off the TurboGears stack by providing a rich JavaScript library that you can use to work AJAX capabilities or those final user-interface tweaks into your application. If you've ever done much work with JavaScript, you already know that development often can be painful because of the lack of standard library functions. Fortunately for us, MochiKit significantly lessens the burden of that very problem, allowing us to focus our attention on more interesting things. Consider the following snippet of code for building a table using MochiKit:

    var rows = [
        ["dataA1", "dataA2", "dataA3"],
        ["dataB1", "dataB2", "dataB3"]
    ];
    row_display = function (row) {
        return TR(null, map(partial(TD, null), row));
    }
    var newTable = TABLE({'class': 'prettytable'},
        THEAD(null,
            row_display(["head1", "head2", "head3"])),
        TFOOT(null,
            row_display(["foot1", "foot2", "foot3"])),
        TBODY(null,
            map(row_display, rows)));
    // put that in your document.createElement and smoke it!
    swapDOM(oldTable, newTable);

A job well done. You'll find all sorts of goodies that'll save you time in MochiKit: logging utilities, AJAX utilities, the ability to fade text, and sorting lists, just to name a few.

And there you have it, the four simple yet elegant components that pack quite a punch when used together -- the power of SQL without writing SQL queries for data storage, a robust and flexible Pythonic web server for generating dynamic content, XML-based templates to provide an overall structure and organization for your documents, and finally, some JavaScript to spruce things up a bit and add some spunk to the user experience.

No doubt, you're wondering how to get started at this point. Well, it's easy. Too easy. Just go out to the TurboGears Mac installation page and follow the steps. All that's required is making sure the correction version of Python is installed and downloading the goods. Then you'll be on the way to creating that Wiki you've always wanted. There's also a massive collection of resources provided to get you up and running. And now, here's a real treat.

An Interview with the Creator of TurboGears

TurboGears is such a cool project that I thought we should try to get some one-on-one time with Kevin Dangoor -- the creator of TurboGears and the upcoming Zesty News product. Fortunately for us, he was more than willing to take a few minutes out of his busy schedule to talk a little more about his work.

&lt;A TARGET="_blank" HREF="http://ad.doubleclick.net/click%3Bh=v7/344c/3/0/%2a/a%3B32503746%3B0-0%3B0%3B12453998%3B4252-336/280%3B16834366/16852261/1%3B%3B%7Efdr%3D38627655%3B0-0%3B0%3B13513799%3B4252-336/280%3B17184607/17202502/1%3B%3B%7Efdr%3D25171877%3B0-0%3B0%3B10905964%3B4252-336/280%3B13990008/14007904/1%3B%3B%7Esscs%3D%3fhttp://seeker.dice.com/jobsearch/gentwo/index.jsp "&gt;&lt;IMG SRC="http://m1.2mdn.net/982522/Dice_Testimonial_336x280_a-85.gif" BORDER=0&gt;&lt;/A&gt;

MR: I always find it fascinating see the progression of events that leads people to do such interesting things as creating a new framework, so before we get to TurboGears itself, could you say a little about your background? Are you a software engineer?

KD: Yeah, actually my degree is in computer science from the University of Michigan. I graduated in 1994, so it's been a while. I've been programming professionally since 1988, but along the way I've also worked jobs in management, sales, and engineering. I've also had a couple of my own companies, which is something else I bring into this whole endeavor. Interestingly enough, it's not just about the programming -- there's also a lot of product management aspects that come up when you're developing professionally.

MR: So what specifically gave you the inspiration for TurboGears? You obviously had the technical background, but where did the creative inspiration come from?

KD: Well, the inspiration for TurboGears is actually my Zesty News product. While working on that, I needed to have the tools to make the web application itself. At the beginning of the year, I started looking at the various frameworks there were available in an effort to put something together that would do what I needed. Along the way I decided to really emphasize plug-ins for Zesty News, and that was the point at which I decided that I needed to document all of the work I had been doing and put it out there so other people could take advantage of it. Rather than being a sudden flash of inspiration, TurboGears came from an evolutionary process in building Zesty News.

MR: So this effort is a full-time job then? It's not just a part-time effort that you work during the evenings?

KD: Yes and no. You could say that my day job is working on Zesty News -- that's what my company Blazing Things is developing at the moment. But I decided that I would develop TurboGears and get it out to the masses before getting back to Zesty News, because I think that TurboGears is really showing that there is a demand and a real need in the Python world for a "full stack" web framework.

MR: So why is the TurboGears stack so reliant on Python?

KD: I think Python is a really easy to learn and fun language for development, and it's not a very difficult endeavor for anyone who's ever had any programming experience. In fact, I've noticed that a lot of people on the mailing list for TurboGears said that they're new to Python so it looks like there are quite a few people that are coming to Python through TurboGears. I don't think they're finding Python itself to be a very difficult part of the learning process. I personally have been developing in Python for about 10 years, and I consider it my language of choice.

MR: How much "glue code" did you have to write to get TurboGears working?

KD: Well, for the first release, the amount of code involved in putting TurboGears together was quite small. I would say the initial TurboGears release was only around a thousand lines or so. I didn't make any notes at the time, but I really don't think it was more than that. It was really small, and the amount of code necessary to get these pieces working together was negligible because they are so nicely written and had a natural interoperability with other projects. The bulk of the code is naturally going to remain in the individual projects that make TurboGears possible, and hopefully some of the components developed for TurboGears will migrate back out into the pieces of the stack themselves. But overall, the amount of code specific to TurboGears has been growing with each release.

MR: Would you say that Rails has had any impact at all on your design of TurboGears?

KD: Well, actually, when I was starting Zesty News I considered Rails but decided to use Python because of particular Python libraries that are not readily available for Ruby. So, yes, I did look at Rails, but the specifics of Rails weren't really an influence on TurboGears because I started with different tools, namely CherryPy and SQLObject. But conceptually it has the same sort of architecture as Rails. The fact that Rails gives you everything you need for a web application from front end to back end is what was missing in open source previously, and that has been a big influence on projects like TurboGears that have come since.

MR: So what took us so long to get to this "full stack" paradigm of web development like Rails and TurboGears? Is Apache losing any footing here?

Click here to find out more!

KD: Well, I think there will always be room for the servers like Apache in the world because it's hard to beat them for serving up static files and things of that nature. As far as application servers like Rails and TurboGears, however, I think lightweight development processes have actually existed for some time with the net-savvy companies like Amazon, eBay, and Google. These companies have all been using languages like Python and Perl internally so I think the idea has been there longer than you might think. But I think there's a real shift happening in corporate America right now with regard to enterprise-level development. They're finally realizing that they don't have to do things that take thousands of lines of XML configuration and tens of thousands of lines of code when they can rely on smaller and more agile frameworks that are just as capable for the common case -- frameworks like Rails and TurboGears.

MR: What advice would you give to developers who are trying to decide whether or not to choose TurboGears or Rails for their project?

KD: There are definitely some trade-offs and I think they go back to the third-party libraries that are available for Python and Ruby. Python has a lot of useful libraries that aren't available for Ruby yet, but Rails has been around longer so, from a documentation perspective, it is better established -- although we're working hard to fix that. I think the other big thing is that TurboGears and Rails have two different styles of doing things and so it also comes back to preference at some point. It's kind of like that the whole Emacs versus Vim argument. The two tools can do the job arguably equally well, but stylistically they are very different. Hence, people might choose one or the other based on their own personal preference and style. TurboGears definitely has a different style than Rails, and for some people, I think that style will definitely appeal.

MR: AJAX has its place in the TurboGears stack, so does that mean that you think it's here to stay? There has been a bit of discussion about that lately.

KD: I think AJAX is here to stay for a while. Browsers are supporting it more and more, and it is something that you can do to provide a much richer user experience than otherwise. It's possible that new standards will come up and newer standards will change the way we do AJAX (remember, it's more of a concept than it is an entity), but for what it does there is really no better alternative right now.

MR: How well does TurboGears perform and scale when compared with the enterprise-level servers like J2EE?

KD: Really, scalability is more about application design than it is about choosing a particular application framework, and that's just one more reason that TurboGears is a very viable choice. As long as you are designing an application in the way that you need it to scale, you should have no problem using TurboGears that relies on a very high level language like Python. Personally, I've done a lot of Java and J2EE development, and I'm much happier working in Python now. I'm able to get stuff done so much more quickly, I fight with the tools a lot less, and it just seems to be a lot more fun overall.

MR: Since you're mostly flying solo on this project, do you use any particular kind of development cycle, or do you pretty much wing it?

KD: TurboGears development is not a solo endeavor, because there are other people leading and contributing to all of the projects involved with TurboGears. For Zesty News, I very much believe in agile development methods. I've done a lot of extreme programming (XP), and so I also believe very strongly in unit testing. In fact, before releasing TurboGears, I actually put together a testing package called TestGears to make unit testing easier. For that matter, I believe very strongly in test-driven development in general. I usually write the tests before the code. I don't need to do, or believe in doing, a giant functional specification beforehand, because I think it is often a waste of time. But I do believe in going through a process similar to XP. So, yes, even working as a single developer I still feel the need for a development process so that I can make sure I'm heading in the right direction and measuring progress.

MR: You're approaching a v1.0 release soon. How long has it taken to get this far, and when can we expect v1.0?

KD: It was really a process that started at the beginning of the year if you count the selection of tools, defining of requirements, etc. I've gone through a variety of different tools throughout the evolution of Zesty News, and in its current form, I'd say that TurboGears has basically existed since July. That was when Bob Ippolito released MochiKit, which was pretty much the last piece of the puzzle. MochiKit is a JavaScript library that helps handle a lot of front-end tasks. It's been nearly 2 months now that I've been spending almost all of my time working on TurboGears, because I want people to be able to easily develop plug-ins for Zesty News.

Naturally, I don't think I can solve all of the world's problems by v1.0. But plenty of useful functionality already exists, and we are already doing a good job of making sure that anything we change between now and then will stay backwards compatible. Changes are being documented, and we are being very disciplined to make sure that people know about changes that have major impacts when transitioning through major versions. We're currently on the fast track to v1.0, but there is already so much useful functionality in there that there is no reason for people to stand by waiting. Forecasting ahead, v0.9 will be out really soon, and v1.0 should be out by the end of the year.

MR: Great. Well, thanks so much for taking the time to chat. You're doing great work with TurboGears and Zesty News. Keep it coming.

KD: Definitely. This has been fun.
The TurboGears Are Spinning Fast

Kevin and the rest of the crew at Blazing Things are making significant progress on a very regular basis, so check the TurboGears website often for new announcements, screencasts, and tutorials. It's really going to be interesting to see how this project continues to develop and the impact that it has on developers and end users alike.

Matthew Russell tries hard to live life as a quintessential renaissance man, but hasn't been making very much progress since becoming enthralled by the cult of Mac. 


Это сообщение отредактировал(а) pythonwin - 25.8.2006, 18:00
PM WWW GTalk Jabber   Вверх
alrond
Дата 25.8.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



 smile 
спасибо! попробую прочитать  smile 
интересно еще..можно ли эти фреймворки и свой сайт использовать с psyco или pyrex?
скорость то должна возрасти  smile 
PM MAIL   Вверх
Artemios
Дата 25.8.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: нет
Всего: 50



Цитата(alrond @  25.8.2006,  18:01 Найти цитируемый пост)
интересно еще..можно ли эти фреймворки и свой сайт использовать с psyco или pyrex?

Эт наверно зависит от хостера...
Либо на собственном сервере - здесь должно быть без проблем smile 

Это сообщение отредактировал(а) Artemios - 25.8.2006, 18:52


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Cr@$h
Дата 25.8.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41




M
Cr@$h
pythonwin, ++ оперативно.

PM MAIL ICQ   Вверх
pythonwin
Дата 26.8.2006, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Cr@$h, спасибо!

Вот подборка документации по TG на русском языке

Cr@$h, сможешь перенести тему к ссылкам и к wiki, т.е.

Цитата

Важно:  Ссылки на ресурсы по Python (Страниц 1 2 Все )
(Очаровательный Python)    foRaver  24  1726  27.7.2006, 15:34
Автор: » pythonwin
Важно: переводим Python FAQ (Страниц 1 2 3 Все )
на русский язык    setq  35  2337  25.4.2006, 04:13
Автор: » allexdav
К последнему непрочитанномуВажно: Wiki + Vingrad + Python
Прочесть всем (3 раза)    setq  3  473  21.3.2006, 05:37
Автор: » beartamer
Важно: подцветка
ура, товарищи!    setq  5  372  26.2.2006, 01:30
Автор: » sergej.z

PM WWW GTalk Jabber   Вверх
Cr@$h
Дата 26.8.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41



Цитата(pythonwin @  26.8.2006,  10:27 Найти цитируемый пост)
Cr@$h, сможешь перенести тему к ссылкам и к wiki

Зафиксировать (закрепить), в смысле? Конечно, done.

Это сообщение отредактировал(а) Cr@$h - 26.8.2006, 12:42
PM MAIL ICQ   Вверх
slav0nic
Дата 26.8.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.5.2006

Репутация: нет
Всего: 5



думаю всё то, что есть в ТГ прикручивается и к django, а разница, как мне кажется, в моделях и этапах  разработки. Ща какраз пытаюсь постигнуть тонкости django, олько с трудом постигается, когда понимаешь, что врядли тебе это когда-то пригодится;)
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
pythonwin
Дата 29.8.2006, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(alrond @  26.8.2006,  01:01 Найти цитируемый пост)

спасибо! попробую прочитать  smile 
интересно еще..можно ли эти фреймворки и свой сайт использовать с psyco или pyrex?
скорость то должна возрасти  smile

Чесно - не пробовал, но идея хорошая...
alrond, ты уже работал с psyco или pyrex?

Это сообщение отредактировал(а) pythonwin - 29.8.2006, 07:26
PM WWW GTalk Jabber   Вверх
pythonwin
Дата 29.8.2006, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(slav0nic @  27.8.2006,  04:17 Найти цитируемый пост)
думаю всё то, что есть в ТГ прикручивается и к django, а разница, как мне кажется, в моделях и этапах  разработки. Ща какраз пытаюсь постигнуть тонкости django, олько с трудом постигается, когда понимаешь, что врядли тебе это когда-то пригодится;)

можно по подробней?

Это сообщение отредактировал(а) pythonwin - 29.8.2006, 09:02
PM WWW GTalk Jabber   Вверх
alrond
Дата 29.8.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



Цитата(pythonwin @  29.8.2006,  07:25 Найти цитируемый пост)
alrond, ты уже работал с psyco или pyrex?

Нет, не работал, но облазил весь интернет.

Кстати, собираюсь протестировать все эти фрэймворки в реальных условиях и разных конфигурациях.
Надеюсь получится более расширенный вариант, чем здесь
http://wiki.rubyonrails.org/rails/pages/Fr...ork+Performance
только не лайтхттп, а нгинкс возьму. и конечно проверю влияние психо на фрэймворки

Как можно в питоне реализовать это? Вычисление времени работы скриптов:
Код

$ttt=microtime();
$ttt=((double)strstr($ttt, ' ')+(double)substr($ttt,0,strpos($ttt,' ')));

[...CODE...]

$ddd=microtime();
$ddd=((double)strstr($ddd, ' ')+(double)substr($ddd,0,strpos($ddd,' ')));
echo ("Время работы: ".(number_format(($ddd-$ttt),3))." секунд");


И куда можно воткнуть в фрэймворки? то есть какие сорсы первым и последним грузится?
В свой код же не воткнешь, фрэймворе "оборачивает" его как фантик конфетку.
Я и сам найду, просто может быть быстрее если кто знает.

Есть рекомендации по типу как здесь?
http://php.spb.ru/php/speed.html


PM MAIL   Вверх
slav0nic
Дата 29.8.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.5.2006

Репутация: нет
Всего: 5



через профайлер и тп модули, или
Код

>>> import time
>>> s = time.ctime()
>>> s
'Tue Aug 29 14:30:55 2006'
>>> s = time.time()
>>> s
1156851063.421
>>> time.time()-s
14.016000032424927
>>>


Это сообщение отредактировал(а) slav0nic - 29.8.2006, 14:36
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
J2A
Дата 29.8.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 2
Всего: 18



Цитата(alrond @ 29.8.2006,  14:52)

Есть рекомендации по типу как здесь?
http://php.spb.ru/php/speed.html

http://omsk.lug.ru/wacko/Python/Perfomance
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
alrond
Дата 29.8.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



Спасибо!!! smile 
PM MAIL   Вверх
pythonwin
Дата 29.8.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



J2A, прикольно!
PM WWW GTalk Jabber   Вверх
dvska
Дата 11.9.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 30.1.2006

Репутация: 1
Всего: 9



Мне кажется производительность web-фрэймворков надо тестировать на  не "изнутри", а "снаружи". Написать на каждом из них однотипные приложения и натравить на каждое из них какой-нить http benchmarking tool

Это сообщение отредактировал(а) dvska - 12.9.2006, 12:53
--------------------
PM MAIL   Вверх
alrond
Дата 11.9.2006, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



Я так и собираюсь сделать...когда из отпуска вернусь  smile 
PM MAIL   Вверх
pythonwin
Дата 12.9.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(alrond @  12.9.2006,  02:07 Найти цитируемый пост)
Я так и собираюсь сделать...когда из отпуска вернусь  smile  

Жду результатов. smile

Это сообщение отредактировал(а) pythonwin - 12.9.2006, 12:27
PM WWW GTalk Jabber   Вверх
alrond
Дата 1.10.2006, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



Всем привет!
я только что приступил к тестированию, собираюсь по жесткому это сделать, займет наверное недельку или поболее, так как делаю в свободное от работы время.

Что во-первых могу сказать (из того, что успел):
включение модуля psycho увеличивает скорость работы django: на 35% - прирост запросов в секунду, на 27% уменьшается среднее время выполнения запросов.
Достигается все это вставкой двух строчек в manage.py и перезапуском fcgi-сервера
Код

import psyco
psyco.full()

Но у этого метода есть большой минус (что на продакшн сервере не должно вызывать проблем):
Потребление памяти увеличивается на 80% виртуальной и в 2.3 раза реальной smile
В абсолютных показателях это 
54424 KB -> 98652 KB
9504 KB -> 22 MB  

Подробности потом со всем остальным вместе... smile 


PM MAIL   Вверх
Cr@$h
Дата 2.10.2006, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41



Будем ждать. Я как раз изучаю средства прогрессивной оптимизации в компиляторах.

P.S. Звучит здорово слово, только старайся не поддаваться звучанию: Psyco.  smile 
PM MAIL ICQ   Вверх
J2A
Дата 2.10.2006, 04:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 2
Всего: 18



Нда. Кто в лес, кто по дрова... Ответ "в тему" был только один... дальше пошли разговоры о Pyrex/Psyco. Может стоит разделить тему?

Да и тема принципиально не правильно названа. Преимущества X против Y. Такое впечатление, что автор хочет убедить себя, что сделал правильный выбор. А если у X вообще нет преимуществ перед Y? Или они не значительны?

Что касается собственно вопроса TG vs. Django - "убийственных" аргументов в пользу того или иного просто нет. Для каждого в итоге это сводится к "нравится-не нравится". Кому-то нравится "легкие" шаблоны в Django и возможность задавать соответствие URL-контроллер при помощи рег.выражений; кому-то нравится, что TG использует уже известные проекты в качестве базовых "шестеренок" или, скажем, был опыт с одним из компонентов, или что в TG есть AJAX-"помошники".   В итоге каждый должен сам выбирать... наиболее простой способ - поставить мини-задание и выполнить его при помощи TG и Django (для полноты картины, можно еще и Pylons) и посмотреть, какой подход "твой".
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
Cr@$h
Дата 2.10.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41



Цитата(J2A @  2.10.2006,  05:37 Найти цитируемый пост)
пошли разговоры о Pyrex/Psyco. Может стоит разделить тему?

Ну, пока мы в окрестностях темы, ведь главный тестер этого дела, alrond, хочет
Цитата(alrond @  29.8.2006,  12:52 Найти цитируемый пост)
и конечно проверю влияние психо на фрэймворки

Про Psyco отдельно конкртено ничего сказано пока не было, мы рассматриваем его влияние на эти каркасы (frameworks) ( smile ).

Добавлено @ 14:46 
Цитата(J2A @  2.10.2006,  05:37 Найти цитируемый пост)
Да и тема принципиально не правильно названа.

Так произошло, что она была выделена из другой и в название перешла эта однобокость. Тему переименовал.
PM MAIL ICQ   Вверх
pythonwin
Дата 2.10.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(Cr@$h @  2.10.2006,  21:46 Найти цитируемый пост)
Так произошло, что она была выделена из другой и в название перешла эта однобокость. Тему переименовал. 

спасибо! теперь более нейтрально! smile
PM WWW GTalk Jabber   Вверх
alrond
Дата 4.10.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



Эти результаты не действительны, так как не было системы при тестировании.
Я собираюсь реально оттестить, мне просто надо немного времени...

но для особо нетерпеливых  smile 

оба запущены как FCGI серверы с использованием Flup. 
вполне возможно, что что-то я настроил не так...

наблюдаю еще один неприятный эффект у обоих - при большой нагрузке FCGI зависают и не реагируют на запросы, приходится убивать процесс.
для Django это например при  ab -c 8 -n 100 http://server.com/
при параметре с=7 работает

проектов пока нет, поэтому я и говорил, что это не настоящие тесты...
все пока по дефолту

http_load-12mar2006# http_load -rate 10 -seconds 10 django
99 fetches, 1 max parallel, 203247 bytes, in 10 seconds
2053 mean bytes/connection
9.9 fetches/sec, 20324.7 bytes/sec
msecs/connect: 0.0565455 mean, 0.137 max, 0.047 min
msecs/first-response: 1.4821 mean, 2.153 max, 1.362 min
HTTP response codes:
  code 404 -- 99


http_load-12mar2006# http_load -rate 10 -seconds 10 turbogears
99 fetches, 1 max parallel, 308088 bytes, in 10 seconds
3112 mean bytes/connection
9.9 fetches/sec, 30808.8 bytes/sec
msecs/connect: 0.0670202 mean, 0.162 max, 0.054 min
msecs/first-response: 16.1312 mean, 18.394 max, 15.703 min
HTTP response codes:
  code 200 -- 99


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


эти результаты не действительны, так как не было системы при тестировании.
Я собираюсь реально оттестить, мне просто надо немного времени...  smile 

Это сообщение отредактировал(а) alrond - 5.10.2006, 09:08
PM MAIL   Вверх
J2A
Дата 4.10.2006, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 2
Всего: 18



IMHO, лучше вообще результаты раньше времени не показывать. Не смотря на двойные поправки о "недействительности" результатов, цифра "в 8 раз" накрепко засядет в умах неокрепших читателей и будет в качестве басни/мифа, даже если потом не подтвердится.
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
pythonwin
Дата 5.10.2006, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(J2A @  5.10.2006,  01:32 Найти цитируемый пост)
IMHO, лучше вообще результаты раньше времени не показывать. Не смотря на двойные поправки о "недействительности" результатов, цифра "в 8 раз" накрепко засядет в умах неокрепших читателей и будет в качестве басни/мифа, даже если потом не подтвердится.

поддерживаю! smile
alrond, отредактируй, пожалуйста, свой пост. smile
PM WWW GTalk Jabber   Вверх
PyAlexey
Дата 5.10.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2006
Где: Россия, Нижний Но вгород

Репутация: нет
Всего: 7



PM   Вверх
pythonwin
Дата 5.10.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(PyAlexey @  6.10.2006,  00:51 Найти цитируемый пост)
WordPress Clone in 27 Seconds (Part 1 of 40) 

это я как понял только для джанго?
PM WWW GTalk Jabber   Вверх
PyAlexey
Дата 5.10.2006, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2006
Где: Россия, Нижний Но вгород

Репутация: нет
Всего: 7



pythonwin, да. Лично мне было бы интересно почитать о написании движка с нуля.
PM   Вверх
pythonwin
Дата 5.10.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(PyAlexey @  6.10.2006,  02:02 Найти цитируемый пост)
pythonwin, да. Лично мне было бы интересно почитать о написании движка с нуля. 

а мне поучавствовать в разработке. smile
PM WWW GTalk Jabber   Вверх
PyAlexey
Дата 5.10.2006, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2006
Где: Россия, Нижний Но вгород

Репутация: нет
Всего: 7



PM   Вверх
pythonwin
Дата 5.10.2006, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



PyAlexey, спасибо, за ссылки!
PM WWW GTalk Jabber   Вверх
alrond
Дата 10.10.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



привет всем!
у меня готовы первые результаты...итак


Тестирование проводил на следующем железе и софте:
Цитата

CPU0: AMD Opteron™ Processor 146 stepping 01
Detected 2000.615 MHz processor.
Memory: 2040652k/2063232k available (1835k kernel code, 21252k reserved, 567k data, 208k init, 1145728k highmem)

Debian 3.1
Linux version 2.6.14-2-k7-smp (Debian 2.6.14-2bpo1) 
Python 2.4.3 (#1, Oct  2 2006, 15:34:32) [GCC 3.3.5 (Debian 1:3.3.5-13)] on linux2
Nginx 0.3.4

Django, Turbogears, Flup из последних SVN


Цель тестирования была определить скорость работы самих фрэймворков и сравнить их друг с другом по скорости генерирования страниц и максимальному количеству запросов на данной конфигурации.
Поэтому была выбрана модель без базы данных, которая контроллером генерировала ответ и парсила один шаблон. В итоге получался HTML-файл c "Hello World!"
Так как не было целью найти наибыстрейший вариант работы какого-то конкретного фрэймфорка, то я использовал связку Nginx + FCGI через IP:Port
Не сомневаюсь, что можно было добиться большей скорости используя сокеты.
При этом я не смотрел на кэш, так как и с кэшированием данных системой фрэймворки должны нормально работать. Как видно из дальнейших результатов, первые запросы были медленнее


Листинг Django-проекта:
Код

# cat urls.py

from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^$', 'dj.views.index'),
)


# cat views.py

from django.template import Context, loader
from django.http import HttpResponse

def index(request):
    t = loader.get_template('world.html')
    c = Context({
            'hello_world': "Hello World!",
    })
    return HttpResponse(t.render(c))


# cat world.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?python import sitetemplate ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
    <div>{{ hello_world }}</div>
</body>
</html>


Для запуска джанги использовал:
Код

# cat start.sh
python manage.py runfcgi method=threaded host=127.0.0.1 port=8801 pidfile=/srv/CMF/dj.pidf


Для проверки работы с Psyco, вставил:
Код

# cat manage.py
#!/usr/bin/env python
from django.core.management import execute_manager

#import psyco
#psyco.full()



Проект TG:
Код

# cat controllers.py
import logging
import cherrypy
import turbogears
from turbogears import controllers, expose, validate, redirect

from tg import json

log = logging.getLogger("tg.controllers")

class Root(controllers.RootController):
    @expose(template="tg.templates.world")
    def index(self):
        return dict(tg_flash="Hello, world!")


# cat templates/world.kid
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?python import sitetemplate ?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#" py:extends="sitetemplate">
<body>
    <div py:content="tg_flash"></div>
</body>

</html>


изменил в конфиге:
Код

# cat dev.cfg
[...skip...]

server.socket_host="127.0.0.1"
server.socket_port=8900

[...skip...]


дял запуска использовал скрипт из http://wiki.codemongers.com/NginxTurboGearsFCGI
где изменил
Код

from fcgi import WSGIServer
на
from flup.server.fcgi  import WSGIServer

WSGIServer(application=wsgiApp).run()                                                                                                                                                               
на
WSGIServer(application=wsgiApp, bindAddress=('127.0.0.1', 8900)).run()



Для тестов использовал команды

Код

ps aux | grep python

ab -c 5 -n 1000 http://djangocom/  = django-project
ab -c 5 -n 1000 http://tg.com/   = TG-project

http_load -rate 10 -seconds 5 alrond.com
http_load -rate 10 -seconds 5 alrond.de



Методика тестирования:
- Запускал проект
- Измерял потребляемую память
- Прогонял 3 раза подряд тест "ab"
- Измерял потребляемую память
- Прогонял http_load 
- Перезапускал проект с psyco и повторял вышеописанные пункты


Более подробное тестирование, с SQL-запросами, вариантами FCGI по сокету и IP, сравнением с Ruby on Rails, с дургими серверами кроме Nginx
я проделаю позже...оставайтесь на связи  smile 

а пока жду конструктивных предложений и испровлений методики

Добавлено @ 17:40 
Результаты:

Первым я прогонял Django

Память и время CPU до теста:
Цитата

root      5880  0.0  0.2 50388 4296 ?        S    14:06   0:00 python manage.py runfcgi method=threaded host=127.0.0.1 port=8801 pidfile=/srv/CMF/dj.pid

после теста:
Цитата

root      6118  3.9  0.3 77460 7264 ?        S    14:13   0:03 python manage.py runfcgi method=threaded host=127.0.0.1 port=8801 pidfile=/srv/CMF/dj.pid


Далее "ab" (приводу только результаты):
Document Path:          /
Document Length:        251 bytes
Concurrency Level:      5
Complete requests:      1000


Цитата


Time taken for tests:   1.333539 seconds
Total transferred:      389000 bytes
HTML transferred:       251000 bytes
Requests per second:    749.88 [#/sec] (mean)
Time per request:       6.668 [ms] (mean)
Time per request:       1.334 [ms] (mean, across all concurrent requests)
Transfer rate:          284.21 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       2
Processing:     1    4   3.9      4      56
Waiting:        1    4   3.9      4      56
Total:          1    4   3.9      4      56

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      5
  75%      5
  80%      5
  90%      6
  95%      7
  98%     10
  99%     16
 100%     56 (longest request)

Time taken for tests:   1.364942 seconds
Total transferred:      403000 bytes
HTML transferred:       251000 bytes
Requests per second:    732.63 [#/sec] (mean)
Time per request:       6.825 [ms] (mean)
Time per request:       1.365 [ms] (mean, across all concurrent requests)
Transfer rate:          287.92 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   1.7      2       7
Processing:     1    3   2.0      4       8
Waiting:        0    2   1.7      2       7
Total:          6    6   0.5      6       8

Percentage of the requests served within a certain time (ms)
  50%      6
  66%      6
  75%      6
  80%      7
  90%      7
  95%      7
  98%      7
  99%      8
 100%      8 (longest request)

Time taken for tests:   1.359483 seconds
Total transferred:      403000 bytes
HTML transferred:       251000 bytes
Requests per second:    735.57 [#/sec] (mean)
Time per request:       6.797 [ms] (mean)
Time per request:       1.359 [ms] (mean, across all concurrent requests)
Transfer rate:          289.08 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   1.7      2       6
Processing:     1    3   2.0      4       7
Waiting:        0    2   1.7      2       6
Total:          6    6   0.4      6       7

Percentage of the requests served within a certain time (ms)
  50%      6
  66%      6
  75%      6
  80%      6
  90%      7
  95%      7
  98%      7
  99%      7
 100%      7 (longest request)



Обратите внимание на процентную расстановку для первого запуска и для остальных  smile 


Теперь тест http_load:

49 fetches, 1 max parallel, 12299 bytes, in 5.00001 seconds
251 mean bytes/connection
9.79998 fetches/sec, 2459.8 bytes/sec
msecs/connect: 0.0552653 mean, 0.071 max, 0.048 min
msecs/first-response: 1.39635 mean, 1.996 max, 1.307 min
HTTP response codes:
  code 200 -- 49



Теперь тест с включенным Psyco
Память и время CPU до теста:
Цитата

root      6189  0.0  0.4 87464 9272 ?        S    14:15   0:00 python manage.py runfcgi method=threaded host=127.0.0.1 port=8801 pidfile=/srv/CMF/dj.pid

после теста:
Цитата

root      6189  4.8  1.0 131584 21232 ?      S    14:15   0:02 python manage.py runfcgi method=threaded host=127.0.0.1 port=8801 pidfile=/srv/CMF/dj.pid



Цитата


Time taken for tests:   1.280942 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      403000 bytes
HTML transferred:       251000 bytes
Requests per second:    780.68 [#/sec] (mean)
Time per request:       6.405 [ms] (mean)
Time per request:       1.281 [ms] (mean, across all concurrent requests)
Transfer rate:          306.81 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   6.7      0     106
Processing:     1    4   5.6      4      86
Waiting:        0    4   5.6      3      85
Total:          1    4  12.0      4     191

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      4
  75%      4
  80%      5
  90%      7
  95%      9
  98%     12
  99%     14
 100%    191 (longest request)

Time taken for tests:   1.117916 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      403000 bytes
HTML transferred:       251000 bytes
Requests per second:    894.52 [#/sec] (mean)
Time per request:       5.590 [ms] (mean)
Time per request:       1.118 [ms] (mean, across all concurrent requests)
Transfer rate:          351.55 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0       2
Processing:     1    4   3.2      4      25
Waiting:        0    4   3.1      4      25
Total:          1    4   3.2      4      25

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      5
  75%      5
  80%      6
  90%      8
  95%     11
  98%     13
  99%     17
 100%     25 (longest request)

Time taken for tests:   1.113417 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      404209 bytes
HTML transferred:       251753 bytes
Requests per second:    898.14 [#/sec] (mean)
Time per request:       5.567 [ms] (mean)
Time per request:       1.113 [ms] (mean, across all concurrent requests)
Transfer rate:          353.87 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       3
Processing:     1    4   3.1      4      26
Waiting:        0    3   3.2      3      26
Total:          1    4   3.1      4      26

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      4
  75%      5
  80%      5
  90%      7
  95%      9
  98%     15
  99%     20
 100%     26 (longest request)






Теперь тест http_load:

49 fetches, 1 max parallel, 12299 bytes, in 5 seconds
251 mean bytes/connection
9.8 fetches/sec, 2459.8 bytes/sec
msecs/connect: 0.0583878 mean, 0.103 max, 0.05 min
msecs/first-response: 1.23051 mean, 3.907 max, 1.059 min
HTTP response codes:
  code 200 -- 49


Добавлено @ 17:41 
Результаты:

Теперь посмотрим на TurboGears

Память и время CPU до теста:
Цитата

root      6324 27.6  0.6 68364 14160 pts/1   S    14:17   0:00 /usr/bin/python ./start-fcgi.sh

после теста:
Цитата

root      6324 27.3  0.7 94088 15516 pts/1   S    14:17   0:18 /usr/bin/python ./start-fcgi.sh


Далее "ab":
Document Path:          /
Document Length:        178 bytes
Concurrency Level:      5
Complete requests:      1000



Цитата


Time taken for tests:   6.88151 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      338000 bytes
HTML transferred:       178000 bytes
Requests per second:    164.25 [#/sec] (mean)
Time per request:       30.441 [ms] (mean)
Time per request:       6.088 [ms] (mean, across all concurrent requests)
Transfer rate:          54.20 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.5      0      28
Processing:     5   29   6.9     30      72
Waiting:        0   29   7.0     29      72
Total:          5   29   6.9     30      78

Percentage of the requests served within a certain time (ms)
  50%     30
  66%     30
  75%     30
  80%     30
  90%     35
  95%     41
  98%     47
  99%     57
 100%     78 (longest request)

Time taken for tests:   6.55886 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      338000 bytes
HTML transferred:       178000 bytes
Requests per second:    165.13 [#/sec] (mean)
Time per request:       30.279 [ms] (mean)
Time per request:       6.056 [ms] (mean, across all concurrent requests)
Transfer rate:          54.49 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     5   26  79.1     23    2499
Waiting:        5   25  79.1     23    2498
Total:          5   26  79.1     23    2499

Percentage of the requests served within a certain time (ms)
  50%     23
  66%     24
  75%     25
  80%     28
  90%     32
  95%     36
  98%     48
  99%     61
 100%   2499 (longest request)


Time taken for tests:   6.23415 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      338000 bytes
HTML transferred:       178000 bytes
Requests per second:    166.02 [#/sec] (mean)
Time per request:       30.117 [ms] (mean)
Time per request:       6.023 [ms] (mean, across all concurrent requests)
Transfer rate:          54.79 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    4   7.8      0      25
Processing:     5   24  46.5     23    1424
Waiting:        0   21  47.0     18    1424
Total:          5   28  46.0     29    1424

Percentage of the requests served within a certain time (ms)
  50%     29
  66%     30
  75%     30
  80%     30
  90%     33
  95%     39
  98%     52
  99%     68
 100%   1424 (longest request)




Теперь тест http_load:


49 fetches, 1 max parallel, 8722 bytes, in 5.00001 seconds
178 mean bytes/connection
9.79998 fetches/sec, 1744.4 bytes/sec
msecs/connect: 0.065551 mean, 0.08 max, 0.055 min
msecs/first-response: 6.08039 mean, 8.168 max, 5.929 min
HTTP response codes:
  code 200 -- 49



К сожалению мне так и не удалось запустить psyco на TG. Хотя скрипт и запускается, но запросы не обрабатываются, выдавая ошибки. Но если быть до конца честным, то однажды, когда я только готовился к тестам, у меня получилось все...только я так и не понял что изменил, что опять все перестало

Это сообщение отредактировал(а) alrond - 10.10.2006, 23:32
PM MAIL   Вверх
alrond
Дата 10.10.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



Выводы:

1) по тестам "ab" Django оказался быстрее Tg примерно в 4.5 раза

2) по тестам "http_load" TG оказался медленнее Django на 18%, а время первого ответа в 4.35 раза больше

3) Сразу при запуске Django экономнее обходится с памятью (50388/4296 против 68364/14160 у TG)
После прогонки тестов у обоих CMF потребление памяти возросло. И здесь Django показал себя не с очень хорошей стороны, увеличив размер виртуальной памяти почти в 1.5 раза,
 а реальной в 1.7 раза. TG же показал увеличение виртуальной в 1.38 раза и реальной только на 10%
И все же Django потребляет существенно меньше памяти

4) TG за время тестов TG потребил процессорного времени в 6 раз больше!

5) Модуль Psyco увеличил скорость отдачи в 1.16 раза (результаты только по Django), при этом увеличив потребление виртуальной памяти в 1.74 раза и реальной в 2.16 раза
После тестов память увеличилась заметнее, по сравнению с тестами без psyco (1.7 раза и 2.92 раза)
Хочется заметить, что если отбросить первый проход теста, то модуль показывает себя лучше (ускорение в 1.21 раза против 1.16)

6) тесты "http_load" для Django без Psyco и Django+Psyco противоречивы. С одной стороны модуль в среднем ускорил время первого обращения, с другой максимальный коннект стал в 2 раза больше.


С чем связаны такие неужачные результаты у TG я не знаю, возможно что-то в настройках или проекте...спешите поделиться мнением!  smile

Добавлено @ 18:25 
Только что прогнал http_load для обоих вариантов по несколько раз подряд.
Как и думал, первый проход был плохим. Поэтому в расчет не брался. Судя по результатам других проходов psyco улучшил свои показатели для первого ответа, но время коннекта все равно плохо

http_load -rate 10 -seconds 5 url
49 fetches, 1 max parallel, 12299 bytes, in 5 seconds
251 mean bytes/connection
9.8 fetches/sec, 2459.8 bytes/sec
msecs/connect: 0.0555306 mean, 0.074 max, 0.046 min
msecs/first-response: 1.41573 mean, 1.864 max, 1.31 min
HTTP response codes:
  code 200 -- 49


http_load -rate 10 -seconds 5 url
49 fetches, 1 max parallel, 12299 bytes, in 5.00001 seconds
251 mean bytes/connection
9.79998 fetches/sec, 2459.8 bytes/sec
msecs/connect: 0.0626327 mean, 0.141 max, 0.05 min
msecs/first-response: 1.17227 mean, 1.618 max, 1.052 min
HTTP response codes:
  code 200 -- 49


Это сообщение отредактировал(а) alrond - 10.10.2006, 18:25
PM MAIL   Вверх
J2A
Дата 10.10.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 2
Всего: 18



AFAIR, у TG разные конфиги для dev и production. Какой использован? Какие db-backend-ы использованы? В обеих случаях sqlite? Что понимается под виртуальной памятью, что под реальной? На какой ОС производились тесты? Какова методика замера используемой памяти?

И неплохо было б прикрепить Django и TG проекты, а то не совсем понятно какие условия моделировались.

P.S. http://softwaremaniacs.org/blog/2006/10/08...rk-performance/
P.P.S. Я вообще весьма скептически отношусь к идее увеличения производительности средствами psyco и ему подобных инструментов. На поиграться интересно, а использовать на реальных приложениях - риск, причем где проявятся баги от использования psyco предугадать практически невозможно (не так давно в ZoPyRus пробегало сообщение о глюках Zope при включенном psyco)
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
alrond
Дата 10.10.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



да, конфиги разные, только вот отличаются они кажется (если мне не изменяет память) только дебаг-режимом.
DB вообще не использовал. Методика довольно внятно описана вначале, вместе с исходниками, как и ОС и все остальное...

ссылку я читал...

про психо - это всего лишь вариант, кому-то подходит, кому-то нет...
PM MAIL   Вверх
isagalaev
Дата 11.10.2006, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



Просили замечания по методике:

- FastCGI сервер запущен в threaded-режиме. Известно, что Питон в тредах работает существенно медленно из-за GIL (Global Interpreter Lock) из-за которого все треды очень часть просто ждут друг-друга, потому что интерпретатором может владеть только кто-то один. Поэтому в юниксах, если есть возможность, серверы с питоновским кодом стоит запускать в prefork-режиме - будет быстрее. Кстати, под Windows ситуация обратная, потому что там создание процесса существенно медленней, чем в юниксах, и там на тредах Питон тормозит, насколько я знаю, все же меньше.

- Насчет Psyco. Джанговские девелоперы тестировали его, и нашли интересную штуку. На 32-битных системах он действительно дает прирост в производительности. А вот на 64-битных - наоборот, производительность падает. Происходит так из-за того, что под Psyco процессор переключается в 32-битный режим и не использует всех прелестей своей архитектуры. Если все это так, то тот факт, что под Psyco Django таки работал быстрее означает, вероятно, что Linux и Python скомпилены не в 64 битах (несмотря на то, что работает это все на Opteron'е). Это так?

P.S. Жаль, статья не на блоге! Никаких пингбеков, и чтобы прокомментировать, приходится проходить регистрацию...
PM MAIL   Вверх
pythonwin
Дата 11.10.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(J2A @  11.10.2006,  02:14 Найти цитируемый пост)

P.S. http://softwaremaniacs.org/blog/2006/10/08...rk-performance/

Спасибо за ссылку! smile
PM WWW GTalk Jabber   Вверх
Smaug
Дата 23.10.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 18.3.2006
Где: Баку-Москва

Репутация: нет
Всего: 4



cорри что пишу тут (почемуто не получается создать тему в этом разделе)
мне нужно помощь по Django
тут предложил себя поработать в одном проекте на этом фреймворке (разумеется бесплатно,нужны знания и опыт),к моему удивлению заявку приняли, и передо мной в скором времени станут реальные задачи (написание todo list,calendar etc).Я знаю базовый Питон,ПХП,но совсем без опыта разработки - какую литературу-туториалы (кроме выложенных на офиц. сайтах) вы могли бы мне посоветовать?
вообще приму с благодарностью любые советы
заранее спасибо
с уважением
PM MAIL WWW ICQ   Вверх
pythonwin
Дата 23.10.2006, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Smaug, можешь описать проблему в форум по питону для web
PM WWW GTalk Jabber   Вверх
pythonwin
Дата 23.10.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



книгоман: мысли после запуска

Цитата

Решил поделиться своими соображениями о запуске knigoman.com.ua, возможно будет интересно.

Сайт аналогичной функциональности вменяемый PHP-программист мог бы запустить дней за 3-5, включая разработку и хостинг. У меня на все про все ушло несколько месяцев разработки на Python/TurboGears. Пожалуй, это говорит о каком-то уровне. smile

Конечно, разработка велась “урывками”, но где-то недели 3 чистого времени получилось, м.б. даже больше. Из них немного меньше половины ушло на хождение по граблям TurboGears, Kid и SQLObject (ууу!). Я, правда, потерянным это время не считаю, т.к. этот опыт думаю мне еще пригодится.

Еще 20-30% времени было потрачено на создание функциональности, которая в первый релиз не вошла (надеюсь, пока): регистрация, RSS-ленты, классификатор и т.п. Убеждаюсь, что самое сложное в разработке: сфокусироваться на действительно важном и забить на остальное.

Хорошей идеей было открыть сайт заранее, разместив там анкету. Пока висела анкета, боты внесли сайт в свои базы, и уже через 9 дней после запуска (т.е. вчера) на сайт пришел первый посетитель с поисковика (”Вольвач Павло”, yandex.ru).

Теперь предстоит самое непростое/непонятное - раскрутка. Анонсы в ЖЖ особых результатов не дали, так что остается платная реклама и Петровка. Помощь специалистов (можно за деньги) приветствуется.

Ну и ссылка для ботов: продать или купить книги в Украине. 


Цитата

   1.   Jabbypanda Says:
      Квітень 19th, 2006 at 02:02

      Поки не буде в Україні наступних речей на відчутно новому щаблі розвитку -

      а) банківської системи
      б) системи електронних платежів
      в) пошти

      то проекти типу “Книгоман” залишатимуться вибором маргіналів…

      але вітаю починання! Вода камінь точить.
   2. Max Says:
      Квітень 19th, 2006 at 05:19

      Jabbypanda: З одного боку, я з вами згоден, але з іншого - я все ж таки оптиміст. І все не так погано.

      Системи електронних платежів демонструють дуже високі темпи розвитку (хочу абсолютні цифри замалі). Пошта працює, крім того, у УкрПошти є зараз багато конкурентів. До речі, Кабмін зобов’язав магазини з річними оборотами понад 5 млн грн обладнати терміналами для обслуговування карток.
   3. Mkdir Says:
      Квітень 20th, 2006 at 16:13

      Особенно жжот последняя строка! smile
   4. dem Says:
      Квітень 23rd, 2006 at 10:26

      TO MAX:
      Видел я твои “крики” в рассылке smile
      Что касается Гиарс, то я тоже только начал переход с Zope + Plone на Гиарс после недавнего Python спринта, на котором Гвидо уделил очень много внимания это фрейворку. А с его опытом, да после Zope… думаю он знает о чем говорит ;)
      Конкретнее, сейчас разрабатываю систему биллинга, для ISP. Зная PHP, Perl, Zope - хочу сказать что вменяемый программист пишушищий на этих языках/платформах потратил бы тучу времени (конкуренты 7-й месяц баги ловят). Идея отделить “программистов от программирования” хоронит думающих программистов, и рождает проекты-недоделки + 2 отдела тестировщиков на каждого пЕдолагу.
      С гиарс (замечу что я только учусь), надеюсь что проект будет сдан через 6 недель. (85% уже готово). Связочка там очень скромная iptables(+patch-o-matic) + iprote2(+esfq) + ulogd + PostgreSQL (+ PL/pgsql) + TurboGears.
      Делайте выводы.
      ЗЫ: В сравнении с тем же Zope, производительность гирас(точнее cherrypy) меня очень порадовала.
   5. Slanj Says:
      Травень 9th, 2006 at 21:40

      Хм, хорошее начинание. Сам ожидал такого проекта уже давно. Только вот попытался заказать книгу - вылезла ошибка.

      Могу предложить свою скромную помощь…


PM WWW GTalk Jabber   Вверх
J2A
Дата 22.11.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 2
Всего: 18



http://omsk.lug.ru/wacko/Django/DjangoVsTurboGears:

Весьма толковая и вежливая беседа в группе turbogears. В итоге приходят к мнению, что нет идеала и нужно потратить выходные, чтобы попробовать и Django, и TG, и выбрать что по душе.

Понравились слова Марка Рамма:
Цитата

Цитата

Цитата

С Django легко начинать, и он хорош для быстрых, простых проектов,
но не так хорош для больших и сложных.

Я, очевидно, необъективен (я один из главных разработчиков Django) (говорит Джекоб Каплан-Мосс, прим. j2a), так что я ухожу от вопроса «что мне выбрать». Но утверждение, что Django не хорош для «больших сложных проектов», далеко от истины.


Джекоб прав, дело не в размере проекта, или его сложности. Здесь сложности другого характера:

    * Если это та сложность, то SQLAlchemy выиграет с большим отрывом у ORM Django
    * Если эта та сложность, то подстановка шаблонов и возможность создавать собственные библиотеки тегов позволяют Kid выигрывать с большим отрывом у Django templates
    * Если Вы работаете со сложными структурами URL, доставшимися Вам в наследство, и они не влезают в объектную парадигму CherryPy, то основанные на регулярных выражениях отображение URL->объекты в Django позволяют ему взять верх над TurboGears.
    * Если Вы разрабатываете сайты, где админка Django – то, что Вам нужно в большинстве мест, то это неоспоримая победа Django перед TurboGears, где административный интерфейс придется писать самому.

Обе системы отражают свое наследие: Django как CMS, TurboGears как фреймворк-база кроссплатформенного приложения. Django более «когерентен» (мне, как физику нравится это слово, если не ясен смысл – читайте как «связный, логичный, ясный», прим. j2a), поэтому его легче изучать, но компоненты TurboGears существовали и до него и использовались в разных контекстах, так что они дают большую гибкость в TurboGears.

Конкретные требования Вашего приложения влияют на то, какой фреймворк будет лучше для Вас. Но хорошие новости дебатов по поводу Django/TurboGears в том, что они оба достаточно зрелы, и нет причин, которые не позволили бы вам осуществить любую идею, выбери Вы один из них. Вне зависимости от того, каким путем пойдете – с ними Вы будете более продуктивны и будете создавать более сопровождаемый код, чем без них.

--Марк


Это сообщение отредактировал(а) J2A - 22.11.2006, 18:14
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
pythonwin
Дата 24.11.2006, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



J2A, спасибо за статью! 
Цитата(J2A @  23.11.2006,  01:13 Найти цитируемый пост)
* Если Вы разрабатываете сайты, где админка Django – то, что Вам нужно в большинстве мест, то это неоспоримая победа Django перед TurboGears, где административный интерфейс придется писать самому.


вот с этим не согласен - в TG есть CatWalk и Web Shell. smile

а вот в TG 0.9a1 и старше CatWalk уже есть, но в TG 0.8.9 админки действительно нет. 

про CatWalk прочитать можно в:
CatWalk 
встраивание CatWalk в проект
TurboTunes tutorial


PS сейчас последняя версия TurboGears 1.0b1 и уже есть идея CatWalk2

Это сообщение отредактировал(а) pythonwin - 24.11.2006, 08:38
PM WWW GTalk Jabber   Вверх
pythonwin
Дата 1.12.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



вот ещё по админовкой части в TG CRUD controller of SQLObject
PM WWW GTalk Jabber   Вверх
Daevaorn
Дата 1.12.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 3
Всего: 70



PM MAIL WWW   Вверх
slav0nic
Дата 11.12.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.5.2006

Репутация: нет
Всего: 5



пример с CatWalk в ТГ конечно радует при знакомстве с фреймворком, а ваще обалдел когда увидел такую красоту) (с вэбом как-то не дружу), но всё равно джанга мне ближе) простая, лёгкая и одновременно мощная
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
pythonwin
Дата 11.12.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(slav0nic @  11.12.2006,  15:39 Найти цитируемый пост)
пример с CatWalk в ТГ конечно радует при знакомстве с фреймворком, а ваще обалдел когда увидел такую красоту) (с вэбом как-то не дружу), но всё равно джанга мне ближе) простая, лёгкая и одновременно мощная

сейчас вышел CherryPy 3.0.0RC1 и что он быстрее чем 2x так что ТГ догоняет по скорости Джанго.

PS а в CatWalk нужно разработчикам добавить проверку на стороне клиента или хотя бы на стороне сервера. smile
PM WWW GTalk Jabber   Вверх
dvska
Дата 11.12.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 30.1.2006

Репутация: 1
Всего: 9



Цитата(pythonwin @  11.12.2006,  12:53 Найти цитируемый пост)
сейчас вышел CherryPy 3.0.0RC1 и что он быстрее чем 2x так что ТГ догоняет по скорости Джанго.

TurboGears на СherryPy 3.x переделают ещё не скоро, видимо в версии TG 2.0 (а ещё и 1.0 не вышла) smile
http://groups.google.com/group/turbogears-...77c5e59b3571993 )

Добавлено @ 14:26 
http://trac.turbogears.org/turbogears/ticket/1181 )
--------------------
PM MAIL   Вверх
pythonwin
Дата 20.12.2006, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(dvska @  11.12.2006,  17:25 Найти цитируемый пост)
TurboGears на СherryPy 3.x переделают ещё не скоро, видимо в версии TG 2.0 (а ещё и 1.0 не вышла) smile


dvska, уже есть версия 1.0 (TurboGears 1.0b2)
за ссылки - спасибо! smile ++1
PM WWW GTalk Jabber   Вверх
Daevaorn
Дата 27.12.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 3
Всего: 70



презантация Django одним из разработчиков:
http://video.google.com/videoplay?docid=-7...oogle+techtalks
PM MAIL WWW   Вверх
alrond
Дата 29.1.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



Я провел подробное тестирование шести фреймворков ;)
django занял первое место, turbogears второе на пару с руби
http://www.alrond.com/ru/2007/jan/25/rezul...a-6-frameworks/
PM MAIL   Вверх
pythonwin
Дата 1.2.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



alrond, ++1. было бы хорошо, если бы протестировал фреймворки с разными шаблонами (cheetah, kid и т.д.)

и перед тестирование лучше спросить код у программеров, которые пишут на этих фреймворках - лишнее повырезают smile
PM WWW GTalk Jabber   Вверх
alrond
Дата 1.2.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



хочу провести такой тест. только вот не знаю как в TG заменить шаблон...
+ добавлю CakePHP и Pylons
PM MAIL   Вверх
pythonwin
Дата 2.2.2007, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(alrond @  2.2.2007,  01:50 Найти цитируемый пост)
хочу провести такой тест. только вот не знаю как в TG заменить шаблон...

http://docs.turbogears.org/1.0/AlternativeTemplating
http://docs.turbogears.org/1.0/CheetahTemplating
http://docs.turbogears.org/1.0/GenshiTemplating
http://docs.turbogears.org/1.0/DjangoTemplating
PM WWW GTalk Jabber   Вверх
alrond
Дата 5.2.2007, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



Дополнил тестирование другими PHP-ными фреймворками, Pylons и TG c разными обработчиками темплейтов
http://www.alrond.com/ru/2007/feb/04/dopol...mvc-frameworks/
PM MAIL   Вверх
pythonwin
Дата 5.2.2007, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



alrond, спасибо, за тест smile
а сможешь показать код проектов?

PM WWW GTalk Jabber   Вверх
alrond
Дата 5.2.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



Вот пример с jinja

Код

tg# cat controllers.py

#import logging
import cherrypy
import turbogears
from turbogears import controllers, expose, validate, redirect
#from tg import json
#log = logging.getLogger("tg.controllers")
class Root(controllers.RootController):
    @expose(template="jinja:tg.templates.world")
    def index(self):
        return dict(tg_flash="Hello, world!") 


Код


tg/templates# cat world.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?python import sitetemplate ?>
<html>
<body>
{{tg_flash}}
</body>
</html>


Здесь не привел закомментированные...
Код

tg# cat sample-prod.cfg

[global]
sqlobject.dburi="sqlite://%(current_dir_uri)s/devdata.sqlite"

# SERVER
server.socket_host="127.0.0.1"
server.socket_port=8900
server.environment="production"

[logging]

[[handlers]]

[[[access_out]]]
args="('server.log',)"
class='FileHandler'
level='INFO'
formatter='message_only'

[[loggers]]
[[[tg]]]
level='ERROR'
qualname='tg'
handlers=['error_out']

[[[access]]]
level='INFO'
qualname='turbogears.access'
handlers=['access_out']
propagate=0



Для других темплейтов просто здесь менял название:
@expose(template="jinja:tg.templates.world")
PM MAIL   Вверх
pythonwin
Дата 5.2.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



в принципе - замечательно - только несколько моментов лишних
Код

# cat controllers.py
#import logging
#import cherrypy
import turbogears
#from turbogears import controllers, expose, validate, redirect
#from tg import json
#log = logging.getLogger("tg.controllers")
class Root(turbogears.controllers.RootController):
    @turbogears.expose(template="jinja:tg.templates.world")
    def index(self):
        return dict(tg_flash="Hello, world!") 


PM WWW GTalk Jabber   Вверх
alrond
Дата 5.2.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 27.7.2006

Репутация: 4
Всего: 6



нда...можно было и убрать, но насколько я понимаю, это не могло так сильно сыграть на производительности...
пару процентов...
PM MAIL   Вверх
pythonwin
Дата 6.2.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



Цитата(alrond @  5.2.2007,  18:52 Найти цитируемый пост)
нда...можно было и убрать, но насколько я понимаю, это не могло так сильно сыграть на производительности...
пару процентов... 

к сожелению в ТГ тот же принцип smile
если бы заменили бы в самом ТГ (+ пакеты - CherryPy и т.д.), то и читабельность и эффективность кода было больше
PM WWW GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Веб-разработка и фреймворки | Следующая тема »


 




[ Время генерации скрипта: 0.4009 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.