LINUX.ORG.RU

PHP vs RoR vs Django


0

0

Опубликованы результаты сравнительных испытаний производительности трёх различных веб-фреймворков: Symphony(PHP), Ruby on Rails и Django(Python).

Вкратце: Rails оказался гораздо быстрее, чем Symphony, а Django - гораздо быстрее, чем Rails.

>>> Подробности

★★

Проверено: Shaman007 ()

Ответ на: комментарий от ero-sennin

> Гвидо не раз просили сделать полноценные лямбда-функции, на что он справедливо замечал: если функция состоит больше, чем из одной строчки, у неё должно быть имя. Толково выбранное имя функции - прекрасная документация, оно позволяет сразу понять, что эта функция делаят, и сильно облегчает чтение кода.

Мегастрёмная отмазка! 

Если бы была нормальная лямбда можно было бы легко реализовывать конструкции типа with-open-file.

На питоне это бы могло выглядить как-то так так:

with_open_file("blah", "r"
    lambda(file):
        do_foo_with_file(file)
        do_bar_with_file(file))

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

CrazyPit ★★★
()
Ответ на: комментарий от ero-sennin

Ыгы вместо того чтобы сделать нормальную лямбду, лучше добавить новое ключевое слово (которое решает только одну из проблем отсутсвия нормально лямбды) и конечно же реализовано через зад:)

CrazyPit ★★★
()
Ответ на: комментарий от anonymous

I'll second that motion.

anonymous (*) (16.07.2006 22:03:42)

anonymous
()
Ответ на: комментарий от Aceler

> Грохнулся бы. Ты можешь сделать 2 лимона на одном сервере на Ruby/Python/Perl/C++? Вперед и с песней

на erlang'e?

CrazyPit ★★★
()
Ответ на: комментарий от CrazyPit

> Мегастрёмная отмазка!

Лямбда не нужна. Пишу на питоне уже давно и много. Лямбдой пользовался только в первые месяцы освоения языка, больше по привычке. В основном в конструкциях типа filter(lambda s: s > 0, my_list). Потом открыл для себя list comprehensions и скоро обнаружил, что лямбдой больше не пользуюсь. Как и функциями filter, map и прочей реликтовой функциональщиной. list (и iterator) comprehensions - это прекрасная находка, они покрывадт 95% всех случаев возможного применения анонимных функций. А для остального, как уже сказали, обычных именованных функций больше, чем достаточно.

Гвидо мудр, если вы ещё не поняли.

anonymous
()
Ответ на: комментарий от dv5ife

> Так, а вот о parser, пожалуйста, поподробнее.

Пожалуйста. mod_parser, по видимому, не существует (хотя я давно не...), работал через CGI.

Писать очень приятно - стройный синтаксис, ориентированный именно на Web. Скажу даже, это единственный язык, ориентированный на веб, встречавшийся мне.

Все дело в выводе. А именно: если строка не начинается с идентификатора функции или вызова функции, она считается html кодом. Поэтому чистый HTML код, пропущенный через компилятор Parser, останется неизменным. Сооветственно, никаких <?php > и т.п. Если нужен вывод функции - просто в нужном месте вызываем ее, прямо в тексте. Это, скажу я вам, красота.

Объектная модель вполне на уровне PHP, не углублялся в нее сильно, поскольку мне вполне хватает такой :) Хотя не помню что там вместо $this. Кажется... $this :)

По произвоительности - ну компилятор, куда деваться. Работает быстро. Доказано Yandex.ru. Хотя опять же, простор для оптимизации есть.

Типизации данных нет. Глобальные переменные работают как в PHP с отключенным registerglobals (то есть, как и положено - все наружные в $HTTP_VARS, все внутренние - глобальны).

Отдельная вкусность - автоматическое определение DocumentRoot и автоматическая сборка из подкаталогов. Последнего не видел нигде и это главная фишка Parser.

Из минусов отмечу пожалуй только крайне малую распространенность.

Можно ознакомиться с моей CMS на Parser - она крайне не закончена, потому как ее концепция устарела, но тем не менее как пример кода можно посмотреть.

http://parser-blade.sourceforge.net

Aceler ★★★★★
()
Ответ на: комментарий от anonymous

> В объектно-ориентированом языке руби функция - это не объект.

Ты что, больной? Тебе же написали, что это объект. Объект класса Proc. Чтобы его выполнить, ты можешь этот блок загребти в переменную. И у тебя эта переменная будет ссылаться на объект типа Proc. Чтобы выполнить тело полученной объекта-функции нужно вызвать метод call.

Млять, да, в Питоне и ПХП можно взять и просто забодяжить две скобки (). И оно выполниться. Но в питоне и пхп ООП соответствующее...

Да блин, вообще, для справки, блоки чаще всего используются для итерации, выполнении груповых операций типа мап, фильтр и т.п. В Руби все методы используются таким образом.

Например для открытия файла можно просто его открыть, а можно с блоком, тогда в блоке нужно записать все манипуляции с файлом. А за самим блоком файл уже будет закрыт. Ну что, программисты, есть такое в Питоне?

Если бы в питоне была нормальная лямбда (да и в пхп тоже), вообще про это никто бы не спорил. Но этого же попросту нету! Один оператор, а нет - то великий Гвидо знает, что блять, если мне не хочется делать лишнюю функцию, которая будет одна и непонятно нахрена.

И что это вообще за доебка? Не нравится call? Насчет смалтолка повторюсь, вчера смотрел синтаксис вроде штука прикольная. Во всяком случае интересная. Но с ним никто и не сравнивает. Я, например, его не юзаю ибо негде.

Для Руби появился некий простор в вебе и среди Перла/Питона/Пхп это самый гибкий и гармоничный язык. Если вы знаете только питон, а на руби программировали только по комментам с лора, то о чем вообще может идти спор? Вы же не в теме?

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

anonymous
()
Ответ на: комментарий от anonymous

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

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

anonymous
()
Ответ на: комментарий от anonymous

> Я про те функции, которые создаются с помощью ключевого слова def. Если это не объект, то что?

Это объект класса Method. Его можно получить явно. И вызывать затем через тот же самый call (как и для анонимных функций).

Hjorn
()
Ответ на: комментарий от anonymous

> Ну что, программисты, есть такое в Питоне?

Оно и в С++ есть. И в C#. А это очень сложно?

> вчера смотрел синтаксис вроде штука прикольная

Funny? 'Ha-ha' funny?

> самый гибкий и гармоничный язык.

Да-да. И Соборный. Руби - нагромождение фич. Которые перегружают язык.

anonymous
()
Ответ на: комментарий от Hjorn

Я так понял, вопрос был про то, к какому объекту они привызяваются. Ответ на этот вопрос - таки Object.

А вообще да, Матца надо было давить маленьким.

anonymous
()
Ответ на: комментарий от anonymous

Уточнение: если методы определяются вне какого-либо класса (глобально), считается, что они "как бы" методы Object.

anonymous
()
Ответ на: комментарий от anonymous

> Лямбда не нужна.

Ну так что там про with-open-file? А также про все те места где нужно заданный код выполнить между одним кодом и другим??

CrazyPit ★★★
()
Ответ на: комментарий от Aceler

>Можно ознакомиться с моей CMS на Parser - она крайне не закончена, потому как ее концепция устарела, но тем не менее как пример кода можно посмотреть.

>http://parser-blade.sourceforge.net

Да уж...действительно...гм..."крайне". Там "Index of /" =)

Но до кода я все-таки добрался: у них на сайте есть руководство. Судя по первым двум главам, он заточенный даже не просто "под web", а под табличную верстку :). Не, я не против, понятное дело, практики делали, для работы, ориентируясь на современные реалии...Или мы с моим мозгом что-то путаем? :)

p.s. да, и еще одно: не совсем въехал, что есть "автоматическая сборка из подкаталогов"?

dv5ife
()
Ответ на: комментарий от Aceler

Последняя новость - повод для оптимизма:

"According to new waves and ideas in programming, parser-blade conception becomes archaic.

I will start new project of next generation CMS soon."

anonymous
()
Ответ на: комментарий от anonymous

Ты слышал когда-нибудь про декларативное и императивное программирование? Знаешь чем они отличаются?

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

Я формулирую задачу. Простую. Чтобы понятно было. Есть массив - нужно получить квадрат его элементов. Когда решение выполняется на Руби, я знаю метод map (кстати, если в Питоне ООП, то почему map фунцкия, а не обращение к методу?? :))) ).

Заметь. Я не думаю над тем, КАК МНЕ ПРОЙТИ и выполнить это действие. Я просто знаю, что для этого нужен метод map. И я пишу это одной строкой:

[1,3,8,2,8].map {|v| v*v}

Заметь, мне не пришлось трахать свой мозг комприхеншеном над тем как это выполнить. Я сразу выполнил нужное действие. Это называется не выполнять рутинных задач. Теперь я подумал, что неплохо бы выбрать среди этих элементов, те, что больше 10.

[1,3,8,2,8].map {|v| v*v}.filter {|v| v > 10}

Заметь, мне не пришлось обрывать эту цепочку и вводить промежуточные переменные. Я просто продолжил дальше используя декларативный код.

И тут я решил вывести получившееся на экран:

[1,3,8,2,8].map {|v| v*v}.filter {|v| v > 10}.each {|v| puts v}

Заметьте, господа анонимусы. Я сделал цепочку из нужных мне действий. Написал все это в декларативном стиле и при этом не ипал себе мозк деталями реализации.

Теперь внимание. Вопрос. Напишите пожалуйста этот код на Питоне и докажите, что лист комприхеншн это есть декларативное, а не императивное программирование. Но особенно интересует код на питоне :)))). Если вы не ответите, считается что в данном забеге Руби победил безоговорочно.

anonymous
()
Ответ на: комментарий от Aceler

Да, и. Вот сейчас залез в собственный код, и выяснил, что объектная модель в Parser куда как мощнее чем PHP. Даже Namespaces есть.

Aceler ★★★★★
()
Ответ на: комментарий от dv5ife

> p.s. да, и еще одно: не совсем въехал, что есть "автоматическая сборка из подкаталогов"?

Есть каталоги:

/a/b/c/index.html

В каталогах /a, /a/b, и /a/b/c есть файлы auto.p. Весь код изэтих файлов будет подгружен в проект автоматически.

Это, я вам скажу замечательная вещь :).

Aceler ★★★★★
()
Ответ на: комментарий от anonymous

> Последняя новость - повод для оптимизма: "According to new waves and ideas in programming, parser-blade conception becomes archaic. I will start new project of next generation CMS soon."

Да-да, я ее уже начал и закончил. Только вот за большие деньги и пока без GPL.

Aceler ★★★★★
()
Ответ на: комментарий от anonymous

> Это не ахиллесова пята, а величайший прорыв в истории скриптовых языков.

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

anonymous
()
Ответ на: комментарий от CrazyPit

> Ну так что там про with-open-file? А также про все те места где нужно заданный код выполнить между одним кодом и другим??

Пиши обычную функцию и не выпендривайся. Если функция делает что-то сложнее a+1, у неё должно быть имя. А то задрали эти безымянные лямбды на полэкрана.

anonymous
()
Ответ на: комментарий от anonymous

> И тут я решил вывести получившееся на экран: [1,3,8,2,8].map {|v| v*v}.filter {|v| v > 10}.each {|v| puts v}

/me прослезившись, убежал изучать Ruby....

Aceler ★★★★★
()
Ответ на: комментарий от anonymous

irb(main):001:0> [1,3,8,2,8].map {|v| v*v}.filter {|v| v > 10}.each {|v| puts v}
NoMethodError: undefined method `filter' for [1, 9, 64, 4, 64]:Array
        from (irb):1
irb(main):002:0>

Программер, елки.

anonymous
()
Ответ на: комментарий от anonymous

> Если функция делает что-то сложнее a+1, у неё должно быть имя.

Гвидо сказал, что это плохо - мальчег запомнил и теперь всем говорит, что это плохо. Только вот я не понимаю, зачем давать имя действию которое выполняется один раз и нигде больше не дублируется? Объясни мне? Зачем мне придумывать название для того, что я не хочу называть???

Потому что один голландец решил за всех что будет так? Так может пусть он идет лесом? А я буду делать так как считаю нужным, а не так как он считает нужным??

anonymous
()
Ответ на: комментарий от anonymous

> [1,3,8,2,8].map {|v| v*v}.filter {|v| v > 10}.each {|v| puts v}

[write(v) for v in [1,3,8,2,8] if v > 10]

wirte - функция вывода. Если бы была нормальная lambda питон здесь смотрелся бы лучше.

CrazyPit ★★★
()
Ответ на: комментарий от anonymous

> Только вот я не понимаю, зачем давать имя действию которое выполняется один раз и нигде больше не дублируется? Объясни мне? Зачем мне придумывать название для того, что я не хочу называть???

Эатем, чтоб другие понимали, что именно делает твоя быдлофункция. Или ты все функции называешь f1, f2, f3, а переменные a1, a2, a3?

anonymous
()
Ответ на: комментарий от anonymous

> Пиши обычную функцию и не выпендривайся. Если функция делает что-то сложнее a+1, у неё должно быть имя. А то задрали эти безымянные лямбды на полэкрана.

аргх. Какие вы таки не понятливые. Лямда здесь вообще не причём. Нельзя офомить код как в руби в блоке. Если бы в лямбде можно было иметь несколько строчек, она бы заменила блок. Если бы в питоне было нормальное метапрограммирование тоже бы не понадобилось. Но самый простой способ добавить конструкции аля with-open-file - сделать многостроковую лямбду.

CrazyPit ★★★
()
Ответ на: комментарий от anonymous

> [1,3,8,2,8].map {|v| v*v}.filter {|v| v > 10}.each {|v| puts v}

[1,3,8,2,8].map {|v| v*v}.select {|v| v > 10}.each {|v| puts v}

Каюсь, попутал с питоновским фильтер. В руби эту хрень делает select.

anonymous
()
Ответ на: комментарий от anonymous

> Пиши обычную функцию и не выпендривайся.

Кстати если бы это было наглядно и удобно то все бы так и деали но я 
что то не помню чтобы где-нибудь был то-же with_open_file или with_GL.

Пришлось бы писать:

def foo(file):
  do_foo_with_file(file)
  do_bar_with_file(file)

with_open_file("blah", "r", foo)

СОВСЕМ НЕ НАГЛЯДНО. И убивает всю идею о блоках.

CrazyPit ★★★
()
Ответ на: комментарий от CrazyPit

> [write(v) for v in [1,3,8,2,8] if v > 10]

Дык, а где здесь возведение в квадрат? И чего это ты Пит, за питонистов примеры пишешь?

anonymous
()
Ответ на: комментарий от CrazyPit

> Нельзя офомить код как в руби в блоке.

def stupid_function(): foo() bar('lalalal') something_completely_different(1 + 1)

Чем тебе не блок кода? С тез пор, как в питоне появились вложенные функции, лямбда стала не нужна. Или ты тоже из тех, кто не умеет давать вещам имена?

anonymous
()
Ответ на: комментарий от CrazyPit

> Нельзя офомить код как в руби в блоке.

def stupid_function(): foo() bar('lalalal') something_completely_different(1 + 1)

Чем тебе не блок кода? С тез пор, как в питоне появились вложенные функции, лямбда стала не нужна. Или ты тоже из тех, кто не умеет давать вещам имена?

anonymous
()
Ответ на: комментарий от anonymous

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

PHP сейчас, к сожалению, очень распространный. Мне было трудно сперва понять этот феномен, поскольку буквально по всем позициям он сдает Python'y, Ruby, Perl'y. PHP не есть язык программирвания общего назначения, поскольку это препроцессор, хотя есть попытки использования его для системного программирования, но имхо это изврат. Могу сходу привести пачку его недостатков: - это препроцессор, а не полноценный язык - все функции встроены в язык - нет неймспейсов (модулей) - регистронезависим - хеши и массивы &#8211; одно и то же &#8211; неоптимально и не удобно - в основном процедурный подход, хуже ООП, нет ФП - нет эксепшнов с трейсбеками - нет многопоточности в принципе, т.к. это препроцессор - компиляция в байт код только в процессе выполнения - страдает скорость - нельзя скрыть исходник однако, средства для этого продаются компанией Zend за $$$ - обладая возможности встраиваться в HTML-код поощряет перемешивания логики веб-приложения с оформлением. - нет возможности интерактивного шелла. - не опенсорс

Однако если подумать, начинаешь понимать, почему он так популярен. Действительно, он создавался, как более простой Perl. На этом и акцентируют внимание создатели для привлечения в ряды разработчиков PHP. Но вместе с тем он потерял и все его сильные стороны. Спрашиваетя, зачем тогда было оставлять $ в имени переменной. В перл хоть это имело значение, ибо там скаляры($), массивы(@) и хэши(%). Здесь же этого нет, но $ остался (предполагаю для более легкого синтаксического разбора :) - т.е. разработчики языка облегчили работу себе, но не программистам PHP) В Python'е и Ruby то этого нет :) Даже регулярные выражения (где Perl просто невъебенно крут) PHP имеет и свои (ereg_match) и от перла (preg_match) - ибо круты. По моему, это какой то невежественный язык... А популярен он потому, что так невежественнен. Ибо ориентирован на новичков в программирвании.. Но зато есть дофига случаев когда напыхтевшись на пхп люди переходили на что то вроде Python и назад уже ни ногой, ибо это небо и земля.

Отрадно, что новые языки типа Python, Ruby хоть еще и не так распространены, но постепенно набирают силу. Python сейчас можно охарактеризовать как сформировавшийся качественный изящный мощный язык, имеющий свою философию, многократно зарекомендовавший себя в разных областях применения. Ruby - молодой новаторский, пусть еще не совсем цельный, но тоже идейный язык, стремительно набирающий популярность. Как показывают споры в этом треде, конкуренция в данном случае идет между Python и Ruby, php тут и рядом не валялся. И это вобщем не плохо, ибо конкуренция в данном случае работает на качество.

Будем надеятся, что эти (и другие, если появятся, и будут лучше) языки и далее будут набирать популярность и в области веба, вытесняя посредственность и заурядность :))

anonymous
()
Ответ на: комментарий от CrazyPit

> Нельзя офомить код как в руби в блоке.

def stupid_function():
    foo()
    bar('lalalal')
    something_completely_different(1 + 1)

Чем тебе не блок кода? С тез пор, как в питоне появились вложенные функции, лямбда стала не нужна. Или ты тоже из тех, кто не умеет давать вещам имена?

anonymous
()
Ответ на: комментарий от anonymous

> С тез пор, как в питоне появились вложенные функции, лямбда стала не нужна.

Если она не нужна, тебя же не затруднит выполнить быдло пример, который я написал выше без лямбды. Тем более что она куцая и годится только для одного действия? :)

Напомню пример:

[1,3,8,2,8].map {|v| v*v}.select {|v| v > 10}.each {|v| puts v}

Описание, смотри выше.

> Или ты тоже из тех, кто не умеет давать вещам имена?

Я из тех, кто не называет ненужное нужным. Каждый день я пользуюсь носками, но я не называю свои носки Васями, Петями и Олями. Они просто носки и я не хочу думать над тем как их называть.

anonymous
()
Ответ на: комментарий от anonymous

> Ruby - молодой новаторский, пусть еще не совсем цельный, но тоже идейный язык, стремительно набирающий популярность.

Он моложе питона всего на 3 года. Или он до старости собрался оставаться молодой новаторской красноглазой поделкой?

anonymous
()
Ответ на: комментарий от anonymous

> Ruby - молодой новаторский, пусть еще не совсем цельный, но тоже идейный язык, стремительно набирающий популярность.

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

anonymous
()
Ответ на: комментарий от anonymous

> Дык, а где здесь возведение в квадрат?

Упс. Ну тогда да не укладываеться это просто так в лист комприхэншс.

[write(v) for v in map(expt2, [1,3,8,2,8]) if v > 10]

> И чего это ты Пит, за питонистов примеры пишешь?

А я на всём пишу:) Так что пофиг. Мне вот например питоноские (верней хаскелевское) лист коприхэншнс нравяться в руби нет к сожалению... Но с другой стороны это только очень приятный синтаксический сахар не чего более.

CrazyPit ★★★
()
Ответ на: комментарий от CrazyPit

> СОВСЕМ НЕ НАГЛЯДНО. И убивает всю идею о блоках.

Если я правильно тебя понял, то такая конструкция будет в Python 2.5 Называется "with", IIRC

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

> Чем тебе не блок кода?

3 раз спрашиваю для особо непонятливых. Нам нужно выполнить некий код в каком-нибудь контексте. Наприр в контексте открытия - безобасного закрытия файла. Или в контексте Начало-конец OpenGL блока или в контексте выборки из БД. Создавать здесь отдельную функцию и как то её именовать - верх идиотизма (в принципе никто так и не делает хотя это в том же питоне возможно), так как хочеться только указать КОНТЕКСТ выпонления блокак кода...

CrazyPit ★★★
()
Ответ на: комментарий от anonymous

> цельный и оригинальный язык

Говорить так про гибрид смолтока, перла, лиспа, питона, ады и прочего дилана и CLU, по меньшей мере, смешно.

anonymous
()
Ответ на: комментарий от anonymous

> Однако если подумать, начинаешь понимать, почему он так популярен.

Чем-то мне это напоминает причины популярности оффтопика. :D

Aceler ★★★★★
()
Ответ на: комментарий от tailgunner

> Если я правильно тебя понял, то такая конструкция будет в Python 2.5 Называется "with", IIRC

Уже понял, молодцы вместо общего решения сделали частное:) Хотя может для Питона это и лучше. Хотя мне не понравилось как нужно создавать сами функции, работающие с with.

CrazyPit ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.