Год назад я полностью перешел в разработку на Python. До этого около 4-х лет писал в основном на PHP. В процессе работы я постоянно сравнивал эти 2 языка и сейчас решил уложить это все в одной статье, чтобы структурировать плюсы и минусы. Для вас эта статья может быть полезна, чтобы разобраться, какой выбрать для ваших задач.
Качество документации кода
Первое, что бросилось мне в глаза, когда я с php перешел на python - это качество документации кода и тайпхинты в популярных библиотеках.
Возьмем для примера самые популярные либы http клиентов: guzzle - для php и requests - для python.
Откройте любой класс в requests и вы увидите, что почти каждый публичный метод имеет параметр **kwarg, что означает - какой-то набор именованных аргументов. Не для всех аргументов есть описание типа. И так почти во всех либах. Даже в нативных библиотеках не используется типизация (обсуждение на stackoverflow).
В guzzle все методы имеют понятный интерфейс с описанием и указанными типами. В php в целом культура описания кода выше. Часто вы сможете использовать либы даже не открывая документацию, а посмотрев исходный код. На python вам почти всегда придется посмотреть примеры использования в документации и только потом понять, как сделать то, что вы хотели сделать.
Синтаксис языка
Python явно проще для чтения. Хорошо написанный код будет выглядеть почти как обычный текст написанный на английском языке.
Когда переходишь с php на python, первое время непривычно учитывать наличие декораторов и контекстных менеджеров в коде. Я считал это лишним синтаксическим сахаром. Но это оказалось делом привычки. Если использовать их правильно, то код становится проще.
Например, так будет выглядеть кэширование результатов метода на 2 минуты через декоратор:
@cache(ttl=120)
def foo(x) -> str:
...
Php же наоборот, содержит меньше синтаксического сахара и неявных конструкций. Это позволяет легче анализировать код линтерами и для автоподсказок в IDE (я пользуюсь phpStorm и pyCharm от Jetbrains).
Использование в веб приложениях
В php один запрос всегда обрабатывает один процесс, для этих целей часто используют nginx в связке с fpm сервером.
Рассмотрим самую распространенную схему работы веб сервера на php:
Она хороша тем, что процесс, в котором обрабатывается запрос, полностью изолирован. Вы не имеете доступа к объектам из другого запроса. Всю ответственность за управление числом одновременно обрабатываемых запросов и числа создаваемых для этого процессов берет на себя php-fpm.
В php гораздо больше веб фреймворков, позволяющих быстро создавать сайты, как простые, так и высоконагруженные. На момент написания статьи, наиболее популярные и известные мне это: yii, symphony, slim, laravel. У каждой из них есть либо свои ORM менеджеры, либо сторонние, с очень большой поддержкой. На python список фреймворков, сопоставимых по уровню поддержи, гораздо меньше, это: tornado, django, flask.
Для Python используются очень разные схемы. Часто это схема nginx -> WSGI -> python app. При использовании фреймворка tornado, прослойки для управления процессами вообще нет, все управление берет на себя сам фреймворк. Поэтому я делаю вывод, что python дает больше возможности в управлении сервером.
На python гораздо проще написать, например, веб-сокет сервер, или разрабатывать в микросервисной архитектуре.
Использование для разработки утилит и моделей машинного обучения
Python абсолютный лидер в этих сферах. Почти все самописные инструменты для devops или парсинга гораздо удобнее и быстрее делать на python. Я думаю, дело в том, что python позволяет очень быстро погрузиться в язык, не изучая глубоко синтаксис и позволяет понимать интуитивно, как использовать простые инструменты. Поэтому непрофессиональным разработчикам легче использовать python.
Для парсинга на python есть библиотека scrapy, аналогичной которой нет в php. Благодаря этому можно гораздо быстрее писать сложные парсеры.
Разработка моделей машинного обучения на php - это извращение, по моему мнению. Python с библиотеками sklearn, xgboost, pytorch, tensorflow, keras ушёл далеко вперед от остальных языков в плане разработки ML. Даже более низкоуровневые библиотеки, такие как numpy, scipy позволяют ученым делать сложные вычисления не вникая в особенность языка.
Выводы
Для веб разработки, в большинстве случаев, лучше подойдет php потому что:
на нем более удобные фреймворки, позволяющие быстрее решать типовые задачи
лучше уровень документации библиотек
Проще схема управления сервером
Но если у вас сложная микросервисная архитектура или вы делаете не типовой сервис, в котором требуется асинхронный веб сервер, то лучше использовать python.
Для других задач, таких как: парсинг, разработка ML моделей, простые утилиты - больше подходит python.
Если вы не согласны со мной, либо у вас есть свои наблюдения, пишите об этом в комментариях.
Ресурсы:
http://xandeadx.ru/blog/php/866
https://scrapy.org
https://ru.wikipedia.org/wiki/Список_ORM-библиотек
https://habr.com/ru/company/ruvds/blog/539098/
https://www.tornadoweb.org/en/stable/guide/running.html
https://www.php.net/manual/ru/install.fpm.php
Комментарии (20)
T1murgar88
09.04.2022 15:34+2Для меня php лучше, ООП более полное, вакансий на веб гораздо больше.Пайтон становиться чисто мл языком, тот же девопс чаще пишут на го
inferrna
09.04.2022 15:57+7"Тяп-ляп - и в продакшн" позволяют оба языка в примерно равной степени, поэтому, ребята, вам не из-за чего ссориться.
garipovazamat Автор
09.04.2022 20:52+1Это понятно. Дело не в качестве кода. Я старался провести сравнение в условиях, когда на обоих языках одинаково качественный код.
0x131315
11.04.2022 00:37+2Тоже для себя сравнивал. Python более простой, но там больше магии, это не хорошо.
Для меня дело именно в качестве, поэтому смотрю в сторону java, а не python. На php слишком много вот этого тяп-ляп, язык позволяет лепить что угодно, это больно, поэтому пытаюсь уйти в сторону более строгой модели.
Отдельный момент - отладка и профилирование, с этим на php не очень хорошо из коробки, а любые, даже такие мелкие, сложности больно бьют по разработке: на больших проектах чтобы тот же профилировщик накатить нужно дать пинка целой прослойке людей, которая не хочет трогать то, что уже работает, и я их понимаю.
Ну и конечно производительность и кеширование: да, php в этом плане проще, в чужую память залезть нельзя, не нужен контроль, меньше бьёт по рукам
почему они и распускаются, к слову. Но это же оборачивается против тебя на этапе оптимизации: после кропотливой работе по оптимизации всего тяжелого, до чего можешь дотянуться, на графике по итогу ты наблюдаешь, что 60-80% запроса это инициализация низких уровней приложения, которая работает всегда, и сделать с этим что-то сложно, потому что приложение живёт один запрос.Ну и конечно в конце приходишь к производительности самого языка. Да, php имеет ядро на си, и встроенные функции очень быстро работают, этого не отнять. Но на практике рано или поздно начинаешь упираться даже в их быстродействие, при работе с тысячами простейших типов, после филигранной оптимизации, и ты готов её продолжить, но понимаешь, что упираешься в возможности php, и они в принципе не такие уж и большие, и уже начинают сковывать тебя, ограничивают твои возможности. Хочется большего.
CatalogLoader
09.04.2022 18:06-2Имхо, очень странное и поверхностное сравнение. грустно ,а я ожидал большего... Надеюсь, что кто-то осилит нормальное сравнение современных php \ python. У нас в компании пишим на всем и еще .net \ c#.
garipovazamat Автор
09.04.2022 19:22+3Ваш комментарий тоже не сильно информативен. Скажите, в чем вы бы хотели видеть более подробное рассмотрение? Чего вам не хватило в этой статье?
bungu
09.04.2022 18:33+4yii, symphony, slim, laravel
если речь идёт про эти фреймворки то уж было бы логичнее сравнивать их с Django, но о нем нет ни слова. В связи с этим предполагаю что автор просто слишком быстро взялся за статью, даже не исследовав все популярные либы для веб на Python
garipovazamat Автор
09.04.2022 19:25Я указал Django, прочитайте статью повнимательней. А подробное сравнение фреймворков заняло бы отдельную статью и очень немаленькую
bungu
09.04.2022 20:36+2tornado, django, flask
Вы их так лихо в один список закинули, но между ними огромная разница. Django это вообще свой мир со своим ORM и архитектурой. Tornado асинхронный(который видимо вы решили сравнить с неасинхронными в php)
garipovazamat Автор
09.04.2022 20:48+1Slim и yii в php например это тоже разные миры. Я к сожалению не могу сравнивать с ассинхронным фреймворком в php, потому что в php нет нативной ассинхронности.
Я больше делал упор на количество разнообразия и размер поддержки в сообществе разработчиков. Наверное стоит указать это более явно в статье.
SerafimArts
10.04.2022 06:30+2потому что в php нет нативной ассинхронности.
Это сфигали нет нативной асинхронности? Начиная с 4ки есть declare ticks, начиная с 5.5 добавили yield, в 8.1 вообще файберы появились, которые считай что гринтреды со своим стеком.
Я уж промолчу, про то, что при наличии функций высшего порядка — любую неблокирующую функцию/метод (а в пхп их достаточно, почти каждая ИО операция имеет неблокирующий эквивалент) можно завернуть или в файбер, или выполнить на эвентлупе (которых опять же куча реализаций, но да, согласен, не нативных).
С другой стороны в пыхе это редко практикуется, так как это просто неудобно. Файберы разве что могут как-то улучшить ситуацию, т.к. позволят одну и ту же имплементацию метода сделать как синхронной, так и асинхронной:
Мой любимый пример с асинхронным file_get_contents// Остальные аргументы скипнем для простоты function file_get_contents(string $pathname): string { $result = ''; $fp = fopen($pathname, 'rb'); Fiber::getCurrent() && stream_set_blocking($fp, 0); while (!feof($fp)) { $chunk = 1024; Fiber::getCurrent() && ($chunk = (Fiber::suspend() ?: 1024)); $result .= fread($fp, $chunk); } return $result; }
dopusteam
09.04.2022 19:17+1Python явно проще для чтения. Хорошо написанный код будет выглядеть почти как обычный текст написанный на английском языке.
Php же наоборот, содержит меньше синтаксического сахара и неявных конструкций.
katletmedown
10.04.2022 12:48+2у неподготовленного читателя может сложиться впечатление, что в мире существует только веб и ml
CrocodileRed
10.04.2022 15:52+2Учитывая качество материала, предлагаю минусовать активнее :-)
garipovazamat Автор
10.04.2022 17:00-1Я не против минусов, но надеялся на чуть большую обратную связь, чем просто минусы. Я рассчитывал на то, что будет обсуждение тезисов, здоровая критика. Видимо на хабре не стоит на это рассчитывать.
CrocodileRed
10.04.2022 17:06+2Не всё подряд заслуживает серьёзного обсуждения. И уж если вы ожидаете моё мнение то вот оно: у вас недостаточно знаний для того чтобы сравнивать. Ну или вы что-то от нас скрыли)
Bigata
11.04.2022 06:16+1В принципе, автор верно указал, что php лучше для веба, python для математики.
Expany
Имхо, сравнение крайне поверхностно. Замечания по документации отдельный вопрос. Культура которого так же отдельная тема.
Упомянут синтаксический сахар, но всего один раз и для одного из сравниваемых языков.
Большая свобода у python, пусть и выглядит более гибким вариантом, но вместе с этим накладывает больше ответственности и ошибок, которые может совершить рядовой новичок.
Материал явно требует дополнения.
garipovazamat Автор
Я не стал каждый пункт подробно рассматривать, потому что каждый из них занял бы отдельную статью. Поэтому выбрал только поверхностное рассмотрение.
Что вы считаете наиболее важным для дополнения? Возможно я бы дополнил статью, если бы понимал, чего конкретно не хватает читателям или в чем наибольшее непонимание
werevolff
Вопрос в другом: почему вы считаете выбранные параметры сравнения более важными, чем все остальные? Например, реализация ООП в обоих языках? Скорость обработки массивов? Скорость математических вычислений? Реализация утиной типизации в интерпретаторе? Сборщик мусора?
На python только tornado, django, flask? А aiohttp, fastapi, pyramid, web2py, pylons, zope? Зачем вообще мне знать, сколько http или web фреймворков на языке, который я оцениваю? Если меня интересует написание web-приложений, то мне достаточно одного фреймворка, реализующего объектную абстракцию для протокола http, чтобы я не писал руками перевод тела запроса в структуру данных языка и обратно.