Комментарии 223
А скорость разработки — это не язык, а года существования компании или года практики разработчика, у которых все уже готово и остаются только " частные случаи". Сегодня back-end совсем упростился, в компаниях на 5 front-end 1 back end, потому поднять базу данных и API для CRM — нужен 1 день, ну еще парочка на частные случае или если есть какие-то особенные вычесления, а вот на Front-end постоянно уходит огромное количество времени.
А правду мне объяснили потом в курилке: все рационализаторские предложения приводят к сокращению штата. А сокращение штата приводит к проигрышу тендеров у крупных корпораций, для которых маленькая компания == компания однодневка.
Другими словами, сокращение штата — потеря денег, если принять во внимание не только технические, а все особенности бизнеса.
NetCracker до сихпор собирает Java-код руками (даже есть целый отдел «релиз-инженеров»). Результат превзошел все ожидания. Сегодня это крупнейшая в своем рынке компания…
Как говорится «скорость — это тоже фича».
Смотрите на это как на технический долг — да, мы сейчас ставим более дорогое железо, но в будущем эту ситуацию обязательно исправим.
Я вновь возвращаюсь к вопросу, что обозначенное выше утверждение справедливо только в определенных рамках касательно размера бизнеса и размера нагрузки.
Мало того, что нужно учесть цифры в разных перспективах (за год, за 5 лет, за 10), так я заметил и еще одну особенность — люди иногда пересказывают догму «программист дороже железа» без привязки к реальности.
Они не учитывают, что догма эта родилась в западных странах, где цены на железо такие же, как в России + куча скидок и отсроченных платежей, а зарплаты в 10 раз выше. Для России, где разработчики получают $1-2k нужно еще много раз пересчитать и убедиться, что догма не обратная. И опять же: с ростом экономики России нужно снова и снова ее пересчитывать.
Автор как-то упускает/замалчивает тот момент, что для самой возможности "доставить ещё один сервер" приложение должно быть горизонально масштабиремо. А для этого, нередко, нужно чтобы разработчики достаточно сильно "вложились" в обеспечение такой возможности.
Бывают ситуации, когда быстрее и дешевле сделать решение на более производительном языке, и которое не будет (изначально) масштабироваться, но будет обрабатывать нагрузку с достаточной производительностью, чем делать мастабируемое решение на более удобном языке и тратить существенные усилия на обеспечение масштабируемости.
Помимо этого горизонтальное масштабирование ещё и добавляет отказоустойчивости т.е. его всё равно придётся делать в том или ином виде.
максимальная нагрузка на сервис. 30 rps или 6000rps с ноды
Представим что у вас 10 000 000 ежемесячных посетителей. То есть ваш сайт входит в US топ150 по посещаемости и находится рядом с такими ребятами как airbnb.com и steamcommunity.com Пусть каждый посетитель просматривает 10 страниц. Таким образом у вас 10000000*10/30/24/60/60 = 38 rps. Стоило оптимизировать сервис до уровня 6к?
Сайты которые мы сдаем на Wordpress, вообще не используют Wordpress для вывода страниц, сразу отрубается WP и кешированные странциы достаются 1 запросом прямо из index.php, получается безумно быстро
Нельзя там кэшировать страницу целиком в файл. Максимум отдельные куски.
Представьте если за пол секунды заходит 20 человек, это 1 сборка вместо 20
Но суть с отдельными частями такая же, кешируйте все, что можно, а realtime оставьте
И если у нас сотни серверов, тысячи, то мы приходим к задаче инвалидации кэша, которая, как известно, сложна.
PS. Контролировать кеш при большом количестве серверов извне сложно, но можно делать 1 запрос на проверку изменений, а изменения хранить как отдельное поле, тогда будет 1 запрос, но не такой критичный.
Это если у вас в отдельных частях ничего не зависит от user_id и от фильтров, которые он вводит.
В сущности я весь разговор подвожу к тому, что оба суждения не верны, если обобщать. Нельзя утверждать, что проблемы решаются любым языком программирования + пара лишних серверов; равно для сервисов с нагрузкой в несколько тысяч в день или час не нужно кидаться оптимизировать для сокращения времени ответа с миллисекунд до микросекунд.
На мой взгляд статья неверна именно в своих основах: обобщение неправомерно и в чем-то непрофессионально — в стиле «надо быстро фигачить код, а плохую скорость компенсируем, это, мол, всегда работает». Нет, не всегда. Можно оказаться один на один с громадным техническим долгом и успешным проектом, который быстро растет по нагрузке, а времени уже не хватит, чтобы сделать хорошо. Должен быть заранее определенный порог, ниже которого не опускаемся по производительности и способности масштабироваться под нагрузку. И порог этот должен учитывать различные бизнес-сценарии, как негативный, так и позитивный.
Еще мне кажется, что автор не имел в виду, что надо всегда оставаться на питоне в любой ситуации. Вы можете наговнокодить за неделю прототип на Django и размножить его на 100 серверов при необходимости, а убедившись что 100 серверов действительно нужны, нанять в это время высокооплачиваемую Java-команду, которая за три месяца перепишет проект и уместит все в один мощный сервер.
И тогда цена проекта получится полностью оправданной — и 100 серверов, и профессионалы покупаются только если они действительно нужны. А если сервис понадобится только 1.5 пользователям, все что вы потеряете — это деньги на микроинстанс и неделю времени.
Про «не выдержал нагрузки» — где мне доводилось работать с приемочным нагрузочным тестированием с таким не сталкивались. Такое происходит, когда методология тестирования нарушена. Если есть обратные примеры, где и нагрузочное приемочное было и методология тестирования доступна для проверки, но все равно уперлись в неожиданное нечто, что тестирование не предсказывало, то буду рад примерам. Иначе несколько голословно звучит.
Такое происходит, когда методология тестирования нарушена.
Тут мы и приходим к тому, что чтобы проект выдерживал нагрузки сразу, разработчик должен быть опытным (дорогим) и чтобы просто проверить идею (которая скорее всего не взлетит по статистике), придется потратить много денег и скорее всего времнеи. Естественно я не говорю о проектах, где большая нагрузка точно будет.
Даже если проект добирается до такой точки, камнем преткновения, по-моему, становится не язык, а задачи и алгоритмы. В тех проектах, где работал я, сложности появлялись не из-за того, что Python «медленный» а из-за того, что какие-то задачи в принципе в лоб быстро сделать невозможно. И кэширование применить невозможно (потому что каждый вызов кода должен был возвращать уникальные данные). Приходилось придумывать какие-то алгоритмы и структуры данных, чтобы можно было максимально быстро генерировать требуемую информацию. И напиши это место хоть на C, ничего не изменилось бы, так как требовалось достать сотни тысяч строк из базы данных, и произвести над ними какие-то действия.
Кстати, Reddit, если не ошибаюсь, на Python написан, а это очень высоконагруженный сайт.
В PHP нет сборщика мусора, во всяком случае, раньше не было. Так что неудивительно, надо было все-таки сравнивать хотя бы с минимально полноценным языком.
Кстати, python на той задаче бинарной кластеризации показал не лучший результат.
Понятно, что оптимизировать питон в питон вряд ли есть резон, но если исходить из принципа достаточной эффективности, то далеко не всегда есть резон переписывать в си то, что достаточно быстро отработает на джаве. А иначе и выбора-то нет.
А что буде тесли 1 сервер упадет? (Риторический вопрос)
Это все сказки, что железо дешевое работы программиста, программисты разные и железо разное, если мы считаем VPS по 10-50 долларов в месяц и Senior с окладом 4000$ в месяц, то да, но если сервер стоит хотябы 250$, то тут другая история.
— Более того, я не согласен про скорость, понятие скорости очень размыто и зависит от прокладки. Такое ощущение, что каждая новая работа — это чистый лист. Потратил на 4000$ больше, зато экономишь каждый год 3000$, а это 15000$ за 5 лет
А что делать, если данные ждут сначала жесткий или SSD, а потом приходится еще и проц ждать )
В больших компаниях спокойного времени часто не бывает вовсе: всегда есть горящая кампания, выход на новый рынок, развитие нового направления, мега-важная бизнес задача. По сути просто выше планка минимального приемлимого уровня по производительности.
С aws и большими компаниями тоже неоднозначно. Не дешевое оно удовольствие в highload: когда счета переваливают за тысячи в день, и когда понимаешь, что отсутствие возможности лично решать проблемы со связью — это задержки в недели и месяцы в важных задачах, а если вот прямо сейчас идут сотни и тысячи заказов в секунду… Все приходят к своим дц в итоге. И своей поддержке. И мы возвращаемся к вопросу оптимизации издержек на железо и поддержку.
это только в сказочном мире так бывает, обычно программистов нужно всё больше если проект живёт, а если не живёт, то и сервера будут не нужны
> Админу теперь вместо 1, надо администрировтать 2 сервера.
для нормального админа разницы нет, сервера то типовые, хоть 50
1 млн объектов в массива + легкая арифметика заняли около 30 секунд на Python и 11 секунд на php7, NodeJS и C = 9 секунд.
Убедительная прозьба не лошить на замеры, замеры сделаны аматорки, был написал 1 алгоритм на всех языках и запускались из под консоли не для точных замеров, а для быстро решения в чем массив обрабатывать.
Так вот, 20 секунд разницы против тоже простого, но более уродливого языка.
на 100 000 000 — это уже 2000 секунд, что есть 30 минут. Откуда берутся 100 млн циклы? Это когда у вас вложеные циклы. Вложеные циклы плохо? Ну а что делать, если задача брать 1 обхект из массива, у которого например 20 полей, проверять каждое поле по определенным патеррнам и тд (безумловно много чего было придумано для уменьшенитя этих итераций, но суть остается)
На конференциях везде проталкивают Джанго, как джина с батарейками, где все есть и ничего делать не нужно.
Если эта числодробилка и есть весь ваш проект, то безусловно, выбираем язык под потребности. Но, мне кажется, есть много всего вокруг этого алгоритма: пользовательские интерфейсы, API и т.д. Их тоже обязательно писать на супер-быстром языке, жертвуя своей производительностью? Python как раз дает такую гибкость.
Поводом выбрать Java может быть наличие статических анализиторов кода, широкое сообщество, кол-во доступных разработчиков на рынке, особенности продукта. Но точно не скорость работы языка как такового.
Для примера вот вычисление чисел Фибоначчи на Python и Cython:
def fib(n):
a, b = 1, 1
for i in range(n):
a, b = a + b, a
return a
%timeit fib(1000)
10000 loops, best of 3: 104 µs per loop
def cfib(int n):
cdef int i
cdef double a=0.0, b=1.0
for i in range(n):
a, b = a + b, a
return a
%timeit cfib(1000)
1000000 loops, best of 3: 1 µs per loop
Время выполнения говорит само за себя.
p.s. А для работы с многомерными массивами, математическими функциями и т.п всегда есть NumPy.
In [11]: def fib(n):
....: p = 10**9 + 7
....: a, b = 1, 1
....: for i in range(n):
....: a, b = (a+b)%p, a
....: return a
In [12]: %timeit fib(1000)
10000 loops, best of 3: 58.5 µs per loop
In [16]: %%cython
....: def cfib(int n):
....: cdef int p=10**9 + 7
....: cdef int i
....: cdef int a=1, b=1
....: for i in range(n):
....: a, b = (a+b)%p, a
....: return a
In [17]: %timeit cfib(1000)
100000 loops, best of 3: 6.02 µs per loop
Разница уже не в 100 раз, а в 10, но конечно все еще существенна.
И разница в серверах (а значит и всей инфраструктуре) может быть на порядки, если задача выполняется не в 2 раза медленнее, а в 100.
ачем сравнивать C и Python, сравнивайте современные развивающиеся языки
Вы, даже если не сравнили, то хотя бы перечислили какие именно и для чего предлагагаете сравнивать.
Но к сожелению это не относится к одной из самых крупных индустрий — игровой. Там проблемы с оптимизацией, которые последнее время стали бичем ААА проектов, равносилен провалу и убыткам.
Архитектура приложения и технологии выбираются исходя из постановки задачи и требований.
Если вам нужно приложение в короткие сроки ваш заказчик должен понимать чем он рискует и какие возможности буду ущемлены.
Другое дело если заказчик ставит изначально целью высоконагруженную систему которой точно будут пользоваться милионы пользователей. Для таких случаев систему требуется проектировать по другому и использовать другие технологии для возможностей горизонтального и вертикального маштабирования.
А Python отлично занимает свою нишу среди других ЯП и справляется со своими задачами в сферах big data & machine learning. Сравнивать его с другими ЯП как сравнивать молоток и ножницы.
Как вы это произносите?
Добавлю в коллекцию к андройду, гиперболойду, Тайланду, таблойду, гуманойду…
Расскажите эти сказки производителям батареек. Они очень порадуются и расскажут как увеличить их емкость в сто раз.
Но это ведь спекуляция, по сути? Если дать компилятору заинлайнить ф-ию, то сишная версия будет как минимум так же быстра.
Да, такое бывает в случае, когда Python используется просто как обёртка над вылизанной и оптимизированной нативной библиотекой, то есть скорость выполнения зависит не от скорости интерпретации Python, а от производительности библиотеки.
Если для выполнения одной и той же операции C++ программист будет использовать более медленную библиотеку, то в данном случае код на Python будет более быстрым.
Пример: библиотеки для работы с регулярными выражениями. Стандартная библиотека C++ в этом отношении очень медленная, поэтому её обходят все, кому не лень.
Это что за задача такая? Задачу в студию! Хочу ознакомиться и лично сравнить.
Если Вы вместо строки на С типа
if (A>B) do_something(); else do_other();
начнете создавать класс для A и делать у него перегруженный метод сравнения, одним из вариантов будет выше приведенное выражение, то да, время на подобные экзерсисы уйдет больше.
Недавно был диспут на подобную тему в ответ на заявление «Ну тут нужна фабрика ....».
Мне кажется, отлично все эти споры разруливает Геннадий Короткевич под ником tourist, почти что ежегодный победитель соревнований Яндекс.Алгоритм, Google Code Jam и многих других. А фишка в том, что они пишет везде, где возможно, на Pascal. Хотя казалось бы.
Зашел посмотреть его решения на Codeforces. Сплошь и рядом С++.
Ну как бы задача решения олимпиадных задач и задача промышленного программирования — это очень разные вещи. В олимпиадных задачах обычно не так много кода, довольно много работы с числами и жесткий лимит времени выполнения кода при выходе за который задача не засчитывается. А заниматься переписыванием узких мест на компилируемый язык просто нет времени, потому что решить надо всё как можно быстрее. Это не очень похоже на то, с чем обычно приходится сталкиваться в реальной жизни
Начнем с того, что в проде надо писать читаемый и поддерживаемый код. На олипмиаде быренько набросал алгоритм и заслал. Зашло — супер, не зашло — фиксим и сдаем.
Но согласитесь, навыки прокаченого пресловутого problem solving skill помогает в продакшене.
Второй момент, типизация хоть и динамическая но сильная, и поэтому все баги с типами которые Вы описываете, целиком и полностью вина программистов… у нас тут массивы с числами не складывают.
Виноват программист, но в языках со статической типизацией ошибка вылезет в худшем случае на этапе компиляции, а вообще IDE сама подскажет, что с кодом что-то не так.
Второй момент, с которым я солидарен с автором, что критический участок можно переписать на Си/ASM и прочее, но зачем простите писать на Си бизнес логику? Или например UI? При умеренных количествах Python может реализовать отличный UI, при очень скромных затратах на разработку.
В целом, думаю данный разговор можно свести к утверждению «на каждую задачу — свой инструмент», но мне кажется, утверждать без контекста что питон — ненадежен, это реально преувеличенно и совершенно неверно.
Мне кажется, что Python для UI — не лучший выбор. Если речь идёт исключительно об UI, то почему бы не использовать для этого более удобные средства, да хоть те же WinForms?
А почему, если не секрет? Никаких причин, кроме как незнания другого языка/технологий, я здесь не вижу.
Хотя в том, что Pytjon не самый подходящий язык для системных задач — я полностью согласен. Но мы вроде бы и не про них сейчас.
Вброс про производительность против продуктивности не засчитан. Выучи язык и пиши на нем, если человек выучил только питон, то это его трудности.
Вы не поверите, на питоне я буду писать скрипты не более 500 строк (примерно естественно). После этого объёма я возьму компилятор, бьющий по рукам хоть немного. Потому что в динамике любой мало-мальски объёмный рефакторинг — боль.
Что касается ошибок, отлавливаемых во время компиляции — ну вот честное слово, не припомню, чтобы на Питоне меня долго мучил какой-то неуловимо-критичный баг, связанный именно с перепутыванием типов (да, бывает, конечно же, но отлавливается очень быстро — активное использование аннотаций типов служит хорошую службу).
Про порог в полтысячи строк не совсем ясный принцип — это на весь проект или на один модуль (класс, компонент)?
Дело вкуса и подхода. Я скорее пишу первичный каркас, на который навешиваю дополнительные плюшки и рефакторю по мере необходимости. Вот в процессе такой "перестройки" система типов помогает очень сильно.
Я сталкивался с подобным. Конечно подобные баги "мучили" меня не неделю и не день, а часа 2-3. Но осадочек остался. По поводу аннотаций — я работал с 2.7, и скрипт был подсобный, для прогона своего рода интеграционных тестов. Собственно, я столкнулся с неприятностями на немного извратном сравнении двух JSON документов.
Порог на один файл, и конечно очень условно. За счёт того, что питон таки умеет инкапсулцию на уровне файлов. Читаемым и легко поддерживаемым может быть и 1000-строчный скрипт.
Она не важна ровно до тех пор, пока не становится важна.
Браузер тут скорее в качестве исключения, как пример штучного оптимизированного приложения. Вся электроника ужасно тормозит — давно вы видели быстрый интерфейс в банкомате, информационное табло, которое сразу реагируюет на нажатия или телевизор без секундной задержки на любое действие?
У меня впечатление, что я слышал эту мантру 10 лет назад.
Есть конечно задачи, которые отлично масштабируются горизонтально; есть задачи, где СУБД в любом случае узкое место. Но есть и задачи, в которых в зависимости от качества (говно)кода пользователь будет ждать или секунду, или минуту.
Правда, в таких случаях больше на скорость влияют эффективные алгоритмы, а не языки. И, кроме оптимизации (преждевременной или нет) этих алгоритмов, мало что может помочь.
Ваш пример годится только для однострочника, накиданного в командной строке по месту. Как только вы захотите переиспользовать этот код — упрётесь в чтение этой клинописи. Почему-то многие при сравнении "одноразовых" языков и "многоразовых" не учитывают, что сам автор может и не прочитать своё творение через недельку — из-за того, что писал в клинописном стиле.
По поводу use strict/my/our — у меня есть перед глазами замечательный пример в виде основного инструмента, С++. Языка, на 50-60% состоящего из легаси. Можно писать хорошо и красиво — но для этого придётся написать свою мини-обвязку, а также следовать правилам, в порверке которых компилятор вам просто так не поможет. Короткий вывод — есть языки, на которых легко писать криво и неправильно — и есть языки, на которых если писать криво и неправильно, придётся постоянно ублажать компилятор "обходными манёврами".
Как по мне, вырисовывается вполне себе зависимость, где объём свободно поддерживаемого кода обратно пропорционален условной сложности компилятора
- На перле или APL/K (из-за эзотеричности их синтаксиса) легко писать короткострочники, но код средних размеров уже может стать нечитаем. Уточню, что и Перл может быть читаем в среднем объёме, если не использовать "клинопись".
- Питон, человеческий перл, яваскрипт и т.п. динамика читаемы и поддерживаемы в рамках среднего объёма (мои наблюдения — в среднем 500, до 1000 значащих строк). И в этом объёме в среднем более продуктивны чем языки со статической типизацией. Так как содежимое модуля и связи внутри вполне можно удержать в голове.
- Всё что выше — требует статической типизации, т.к. кол-во связей и общий объём уже таков, что прилетевший из ниоткуда инт вместо строки в рантайме приводит к боли при отладке. А транслятор в этом помогать не желает. И рефакторинг превращается в охоту за тараканами.
Думаю, все согласятся, что статически типизированные языки менее продуктивны
Классный аргумент. Я не согласен. Зря так думал.
Вот, например, недавно вышедшая книга «Kotlin in Action» повествует:
Following are some of the benefits of static typing:
Performance — Calling methods is faster because there’s no need to figure out at runtime
which method needs to be called.
Reliability — The compiler verifies the correctness of the program, so there are fewer
chances for crashes at runtime.
Maintainability — Working with unfamiliar code is easier because you can see what kind
of objects the code is working with.
Tool support — Static typing enables reliable refactorings, precise code completion, and
other IDE features.
В итоге обеспечивается fearless refactoring — одна из заповедей TDD.
Так что давайте смотреть на продуктивность шире, чем количество строк.
И как-то выпадает из этого доказательства то, что скорость Python — это далеко не единственный и, возможно, не главный недостаток. Главным недостатком, на мой взгляд, является слабая ошибкоустойчивость Python, которая всё с возврастающей нелинейной силой начинает проявляться по мере роста размера и сложности проекта. Для чего-то простого Python вполне приемлем, для чего-то сложного или ответственного — нет.
Ах да, скорость языка тоже важна для целей корректности программы, так как позволяет использовать более простые, а потому и более надёжные решения там, где для медленных языков придётся изгаляться.
является слабая ошибкоустойчивость Python, которая всё с возврастающей нелинейной силой начинает проявляться по мере роста размера и сложности проекта
Обоснуете, или оценочное заявление?
def static_typing(i: int) -> int:
return "bla bla bla"
print(static_typing(11))
Вы правы, не делает. Но ошибки отлавливать стало проще с использованием MyPy https://www.google.com/amp/s/ericjmritz.wordpress.com/2015/10/08/static-type-checking-in-python-using-mypy/amp/.
В дополнение к этому, например, PyCharm подсвечивает потенциальные ошибки прямо в редакторе.
Зачем иметь сторонние тулзы если проверки типов можно встроить в сам язык? Мне сторонники динамических языков напоминают диких велосипедостроителей: сначала объявляем статическую типизацию злом, а потом начинаем впиливать собственную костыльную реализацию с помощью комментариев/атрибутов/специальных тулчейнов… Меня не оставляет вопрос — зачем, если можно довериться профессиональным решениям?..
И тут уже выбор языка, который медленнее в 5 раз, смотрится совсем по-другому
железо сейчас дёшево как никогда
а кто его покупать пользователям подобных поделок будет — компания? Или если имеется в виду только серверное оборудование и узкий круг веб-разработки — то так и надо писать.
Во-вторых, он сравнивает 'median hours to solve problem', и это неправильно. В реальных проектах важно среднее, а не медиана — потому что среднее учитывает те 10-20% затянувшихся задач, которые в итоге и тормозят весь проект, а медиана — нет.
В ограниченном микросервисами и вебом мирке автора питон возможно действительно fast enough (хотя с этим тоже можно спорить). Но микросервисами разнообразие ПО не ограничивается.
Ядро ОС на питоне? СУБД на питоне? Может быть 3D? Ну хотя бы шифрование? Прошивка маршрутизатора на питоне?
Пользователю у которого тормозит софт на телефоне тоже предлагается кластер на пару десятков серверов в кармане носить?
import redmine # redis, pymongo, etc.
# Do something
Питон хорош, но не идеален, поэтому везде пихать не надо, как и любой другой язык…
чтобы написать код для обработки строк на разных языках
Ну, как бы на java можно написать и медленный код через стринги и быстрый через стрингбилдер, байты и прочие прибамбасы.
Не знаю что насчет общих задач, но, например, для парсинга скорость играет большое значение. Приведу пример из практики: ANTLR парсер кода PHP на Python работает примерно в 30 раз медленнее C#, вот issue на GitHub: Extremely Poor Performance Parsing PHP. Соответственно если в C# парсинг будет практически незаметен, то в Python придется ждать секунд 15. И в этом случае я пожалуй другой язык выберу.
Более того, динамическая система типов в Python будет адом при обработки древовидных структур. И в том же ANTLR я уже фиксил баг в рантайме, которого не было в статических языках из-за проверок на этапе компиляции.
1) Делается изначально веб-проект, где подразумевается много изменений и сдвигов = php/python/ruby
2) Проект вырос и начались траблы в каких-то местах? Перепиши ряд ключевых библиотек на C
3) Проект вырос и дает стабильное бабло? Перепиши проект на Java/C#
Вот такой алгоритм работы, который работает достаточно хорошо. И решает бизнес цели.
И хочется сказать сразу, что большая часть проектов остаются на 1 этапе. Некоторые переползают на 2 этап и буквально единицы на 3.
3) Проект вырос и дает стабильное бабло? Перепиши проект на Java/C#Зачем если все хорошо?
Если и переписыать, то только если это даст положительный экономический эффект.
Да — каждый инструмент под задачу, да — кто-то знает лучше технологию А чем B, но имхо, в современном мире энтропия технологий достигла такого уровня, что всегда есть некоторый пулл из них, в котором они приблизительно равны по требованиям к уровню инженера и скорости разработки, но среди них есть набор таких, что они просто работают лучше / быстрее / надёжнее архитектурно.
Сейчас поигрался с expressJS и если бэкенд REST — буду писать на JS. Просто JS нравится больше Py, а разница в инструменте для меня минимальная — и так можно и так.
Если по условиям задачки есть только PHP, тогда другое дело. Из того, что провайдеры предлагают за копейку из коробки — пхп абсолютный лидер.
Так что сарказм не очень уместен. Если инструмент подходит к задаче и он есть в наличии, то надо брать ржавую лопату и копать, а не мечтать о сияющем экскаваторе. Особенно там, где копать -то пару часов)
… и теперь пришли к выводу, что уже сам Python является узким местом. Но он имеет возможность вызова кода на C…
Для питона очень легко пишутся расширения на C/C++. Кроме того есть уже библитеки для выноса операций в C-код, например numPy даёт сразу оптимизацию в полпорядка при работе с массивами.
Есть две вещи, за которые я не фанат питона:
— артефактный к другим языкам код (сложно переключаться)
— obj['key'] — вызывающий эксепшен (вот бесит меня писать obj.get('key')
— obj['key'] — вызывающий эксепшен (вот бесит меня писать obj.get('key')
Извиняюсь за некропост, но не понял пример с гетом. Почему не подходит obj.key?
Во втором питоне (не знаю как в третьем) обращаться к ключу объекта dict как к свойству нельзя. Если же мы обращаемся к не существующем ключу как к ключу, то вылезает исключение и все ломается. get гарантирует, что мы не получим исключения при несуществующем ключе.
Так это наоборот меня радует после пхп. Есть куча вариантов:
— названный вами get
— if 'key' in obj
— try / KeyError
— использовать свой объект (об этом ниже)
Возможно в каких-то ситуациях вам и не нужен словарь, а больше подойдет свой объект. А в объекте можно перегрузить поведение обращения к атрибуту.
В вашем примере вы же все равно потом делаете проверку, вернул ли вам словарь значение по ключу, верно? Поэтому ваш пример — иллюзия упрощения. Но может я неправильно вас понял, приведите кусок кода, вдруг посоветую что подходящее.
В реальной жизни много ситуаций, когда что-то не заполнено или недополучено, потому что по сути является опциональным. И мне хочется писать в таких случаях кратко.
Случаи, которые нужно обрабатывать отдельно, я сам обработаю. А где нужно выкинуть исключение выкину его сам. Мне не очень нравится, когда из-за минорной ошибки, падает приложение.
Но на вкус и цвет фломастеры разные. Кому-то нравится контроль кода во времени исполнения, кому-то нет.
Типичный пример: кофигурационный файл. Второй типичный пример JSON или RPC ответ от сервера.
Вообще человеку проще разбирать структуру, в которой опциональным ключи отсутствуют.
Поэтому их возвращает много кто.
Типичный пример: кофигурационный файл. Второй типичный пример JSON или RPC ответ от сервера.
Да теории то я достаточно увидел, я просил пример кода. Мне чрезвычайно любопытно, как вы организуете программный поток без проверки на несуществующий ключ. Не само получение ключа, а что дальше происходит.
Всю голову сломал, придумал только случай, когда все директивы в конфиге или ключи в JSON булевы, и в этом случае вроде как можно пропустить проверку (что тоже не очень ортодоксально). Но больше придумать не смог.
Мне бы ваши проблемы)
В конф файле у нас может быть указано имя файла. Если имя файла не указано или пустое или false, то файл не обрабатываем.
В моём случае: десериализация JSON в строго типизированную структуру и дальнейшая работа с ней. Правда, это не Python.
Код:
var s = json.Deserialize<SomeStruct>();
...
if (s.Param.HasValue) ...
Многие реальные практические задачи, с тех пор не изменились по нагрузке.
но они никогда не заметят разницу между 35 мс и 25 мс
Посмотрите на этот онлайн секундомер:
http://sekundomer.net/
— и убейте меня. Я замечаю.
Да, сама по себе статья хорошая. Но не этот кусок. Тут автор оригинала ляпнул не проверив.
В смысле, как вы это замечаете на этом сайте? Я пробел-то не успеваю нажать быстрее 100 мс, о чем речь вообще?
Но при должной концентрации можно начать выделять эти моргания, то есть — они не сливаются в сознании, а идут урывками.
Скорость нажатия клавиши пальцем упирается в вашу скорость реакции и нервного импульса, а также в скорость вставания клавиши пробела в то положение, из которого его можно было бы нажать заново.
А скорость восприятия времени зрительно упирается только в скорость мысленного сравнения двух изображений, которая может быть много быстрее.
Возьмите игру на скоростное сравнение — поймёте, о чём речь. В этом плане мозг может быть очень быстрым.
Ну слушайте, вы уж совсем за уши притягиваете. При чём тут моргания, которые при должной концентрации можно рассмотреть? Речь идет о скорости обработки запроса пользователя, и его восприятии этого. Что 25, что 35 мс — это воспринимается как мгновенно, реальный пользователь реальной системы разницы абсолютно не заметит. Об этом и идет речь, а не о разрешающей способности глаза/мозга при предельной концентрации
Это все сказки, что железо дешевое работы программиста, программисты разные и железо разное, если мы считаем VPS по 10-50 долларов в месяц и Senior с окладом 4000$ в месяц, то да, но если сервер стоит хотябы 250$, то тут другая история
по словам знакомого, который работал в яндексе, у них так часто и делали — если тормозит сервер, то им проще было добавить N гигабайт памяти, перевести на SSD, заменить на более производительный процессор, чем тратить N часов разработчиков/администраторов на поиск этих тормозов и попытку их устранить. Кстати не факт что она в итоге окажется успешной. Как минимум для dev окружения, насчет прода не помню
К примеру, в WEB-разработке мы сталкиваемся с несколькими проблемами скорости Python:
1. Получение данных из хранилища и их обработка
2. Обработка данных из Request
3. Рендеринг шаблона.
Все три проблемы концептуально решаются минимизацией Python операций.
1. Большинство операций в популярных Python ORM — лишь обёртки для родных функций БД. Оптимизируя код обращения к БД, программист должен свести к минимуму обработку данных в Python.
2. Обработка данных в Request, в большинстве случаев, выносится на REST Endpoints с асинхронными обращениями. В результате, часть асинхронного программирования берёт на себя JS, который контролирует асинхронные запросы, частоту обращения к серверу и т.д. Но, если уж совсем сложная операция, на серверной стороне задействуются свои механизмы создания потоков или процессов. В любом случае, за получение результата будет отвечать JS код.
3. Аналогично дела обстоят с шаблонизаторами: мы либо используем готовые механизмы кеширования шаблонов, либо (что сегодня более популярно) делаем статику и шаблоны независимыми от Python. Благо есть ангуляры, реакты и т.д.
Полагаю, что в других отраслях существуют такие же способы обхода скорости Python, которые позволяют использовать этот язык для решения сложных задач, путём минимизации операций в интерпретаторе Python. И тут сам Python можно использовать как скриптовой язык. Вспомним тот же Ansible: Python в нём является лишь обёрткой для выполнения различных команд в среде операционной системы. Фактически, разработчики берут менее сахарный синтаксис того же bash'а и пишут скрипты на python для объединения объёмного bash кода в простые python команды.
Но вот что Python реально не может добиться, так это собственной производительности. Ему очень часто нужен чужой API для решения задачи. Однако, если осознать упомянутую концепцию «используй меньше Python в Python приложении», начинаешь учить другие языки… чтобы, как ни странно, обернуть их в Python код.
P.S. конечно, можно сказать, что на PHP хорошая шаблонизация… только вот беда, PHP, по сути и является шаблонизатором. При том, кривым. Вместо того, чтобы учить его работать с чистыми шаблонами, авторы стали нагружать эти шаблоны ненужной логикой. В итоге, конечно, появились достойные шаблонизаторы на пыхе… но они все просто убогие. С одной стороны, им нужно время, чтобы нарастить функционал, исправить ошибки… сдругой, нет у них времени. Сейчас идёт тенденция к отделению шаблонов в пространство Frontend со своими сборщиками и JS обработчиками. Так что, даже в условиях CMS разумнее будет выбрать python только за счёт потенциального масштабирования проекта с выносом фронта в JS фрэймворк и подключением REST API.
P. S. Вы, между прочем, зря .htaccess ругаете, сама эта задумка настолько удобна, что ради него даже специально ставят тяжеловесный и монструозный апач, отдавая ему статику (чтобы он хоть что-то делал, от большего серваки просто загнутся), ибо все настройки производятся по сути в одном файле, лежащем в корне сайта, для их применения не нужна даже перезагрузка (!), еще это удобно в плане удаленной настройки, вместо того, чтобы часами объяснять что и где нужно прописать и что и куда положить, достаточно прописать все настройки в одном файле и кинуть его человеку, чтобы он положил его в корень своего сайта, а уж где он находится — знает даже домохозяйка. И в этом файле будет все — и непосредственно сами настройки сервера, и формирование ссылок, и запреты на исполнение каких либо файлов, их отдачи, и т. д. На том же энджинксе нужно править не один файл, причем часто вписывать аналогичные строки одновременно в несколько файлов, причем часто с отсутствием какой-либо логики. Для меня загадка, почему ни один сервер еще такое не поддерживает. Имеются, конечно, некоторые решения, например, парсить его регулярками и перловыми скриптами чуть ли не по крону эти настройки применять, но это уже костыли, разумеется…
P. P. S. Минус не мой)
Насколько я помню, в PHP тоже есть различные соглашения об оформлении кода и всего пара нормальных решений для тестов. Но, скажем так, соглашения эти долгое время игнорировали, а своего нормального уровня пакеты для тестов достигли лишь несколько лет назад. Понятно, что старые решения было уже труднее переделывать под популяризованные стандарты разработки.
По Java ничего конкретного сказать не могу, поскольку не работаю с ним. По отзывам коллег могу представить, что там ситуация промежуточная: лучше чем в npm, но хуже, чем в Pypi.
Аналогично, JS — слабосахарный язык. По-умолчанию он не имеет даже команды форматирования даты/времени. Но, на него много готовых решений, которые берутся в npm. Но они, по большей части, собраны на коленке, либо это промышленные решения, но их гибкость оставляет желать лучшего (приходится под них подстраиваться, либо отказываться от них). Стандартов оформления JS кода — несколько. Тестирование вообще не популярно, хотя я пишу тесты на фронтэнд. И если уж говорить о синтаксисе, то мне и синтаксис JS нравится, и синтаксис Python. Синтаксис Ruby не совсем понятен. Но я его действительно не умею готовить. Вообще, вопрос синтаксиса и оформления кода уходит в холивар только тогда, когда человек банально не хочет изучать язык.
P.S. .htaccess не нужен! Это рудимент, как и Apache. Нормальный роутинг, так или иначе, реализуется на программном уровне, а в CGI мы вынуждены дополнять его .htaccess для корректной работы. Ну а в случае связки PHP и Java/Python/Ruby, мы вообще получаем дохлый апач с его CGI и родное решение от «святой троицы web-языков», которое охотней работает на Nginx и предлагает более гибкую и простую настройку.
P.P.S. Минус не принципиален. Интересно, конечно, узнать мнение его автора. Могу предположить, что ему не понравилось высказывание о скорости шаблонизации в отдельных PHP шаблонизаторах. Справедливости ради, стоит сказать, что эта скорость выше, чем у конкурентов. Ну или человек просто самозабвенно любит PHP.
А зачем защищать пакеты с классами при помощи .htaccess? Они обычно не находятся в веб-доступной директории. Подозреваю, что из-за этого и был минус.
Папка '/var/www/project', в ней все файлы и папки проекта, среди них есть папки 'public' и 'vendor', в 'vendor' пакеты composer, в 'public' файл 'index.php', и сюда же смотрит веб-сервер. Практически во всех фреймворках так.
В папке 'project' хранится весь код приложения. Модели например могут храниться в 'app/models'. В index.php подключается автозагрузчик через include '../vendor/autoload.php' и все, дальше используются только названия классов с пространством имен. В представлении или где-то еще пишем 'use app/models/MyModel;' и при первом обращении к классу MyModel файл подключится через composer. Отсчет естественно идет от корня проекта, а не от public. Сами представления тоже необязательно в папке public хранить, они подключаются механизмом рендеринга фреймворка.
Ну я бы не сказал, что разделен, просто объединяется уровнем выше.
/var/www/project:
app
config
resources
public
index.php
vendor
Хотя да, папку public можно вынести куда нужно, только пути в index.php поправить.
Рекомендации по автозагрузке кажется описаны в PSR. Образцы это проекты на фреймворках типа Yii, Laravel, Symfony.
Да, но в JS эта проблема практически полностью решается благодаря плагинам к jQuery (если речь идет о свистелках). Понятно, что тоже задействуется сторонний код, поэтому я, как правило, опять же, перелопачиваю код известных плагинов и пишу на их основе свои, при аналогичном функционале позволяет сократить исходный код почти в два раза, ибо часто логика произрастает неизвестно из какого места.
Хорошо, но все-таки, для Вас при переходе с PHP на Python принципиальны тесты, стандартизация и менеджеры пакетов? Просто первые нужны исключительно в промышленных масштабах, последнее решается непосредственно средствами языка и своими/сторонними фреймворками (если я правильно понял, как в случае Pypi, к которому тоже необходимо прибегать). Или может быть всему виной сложившиеся вокруг PHP известные предрассудки и оправданно его очерненная репутация школьниками, клепающими на нем сайтики для своих игровых кланов? Пока ответа на этот вопрос я не нашел, но мне интересно, честно признаюсь…
habrahabr.ru/post/338880
(В статье рассказывается, почему современный web даже хуже, чем программы времен Windows 98)
Да, Python медленный, но меня это не волнует