в чем минусы питона
Выбираем язык программирования: что нужно знать о Python
Рассказываем, чем хорош Python, сложно ли его учить, где его используют, — и сравниваем Python с Java и JavaScript.
Python — скриптовый язык общего назначения. Скриптовые языки обычно используются для небольших задач, но Python никак не вписывается в эти рамки. В отличие от, например, JavaScript, сфера применения Python не ограничивается веб-разработкой: подробнее мы об этом расскажем ниже.
Этот язык программирования:
В бэкграунде — программирование, французский язык, академическое рисование, капоэйра. Сейчас учит финский. Любит путешествия и Балтийское море.
Для чего его используют
Из самых популярных отраслей — Data Science, автоматизация и веб-разработка. Вот области, в которых используется Python:
Подробнее о применении Python можете почитать здесь: Для чего нужен язык программирования Python.
Легко ли учить Python?
Python — один из лучших языков для начинающих. Он гибкий, почти «всепрощающий», и у него минималистичный синтаксис. В работе на Python вам не придётся беспокоиться о тонкостях работы с памятью и указателями (как, например, в C++), зато вы сможете сразу приступить к программированию в дружелюбной среде. А ещё Python подробно пишет, где у вас в коде ошибка и какая (на английском), — это очень удобно.
Плюсы и минусы Python
Плюсы
Минусы
Какие у Python конкуренты
Стоит ли учить именно Python? И чем он отличается от других языков? Давайте сравним его с Java — ещё одним кроссплатформенным объектно-ориентированным языком, с которым Python соревнуется в рейтингах, и с JavaScript — популярным скриптовым языком для веб-разработки.
Python vs. Java
Python и Java — соседи по рейтингу, и у них есть общие черты: например, поддержка объектно-ориентированного программирования и кроссплатформенность.
Но много и различий.
Типизация
Начнём с формальных различий: в Java, в отличие от Python, типизация статическая. Это значит, что типы переменных прописываются в коде и считываются на этапе компиляции, а некорректная программа просто не запустится. В Python вы сэкономите время разработки (типы переменных не надо обозначать), но об ошибках узнаете уже после запуска программы.
Компиляция
Python — интерпретируемый язык (об этом мы чуть подробнее рассказали выше), а Java использует и компиляцию, и интерпретацию. Благодаря этому Java получает выгоду обоих способов — кроссплатформенность и скорость.
Скорость
Здесь выигрывает Java. Скорость — её большое преимущество, в то время как у Python это одна из слабостей. Например, простое двоичное дерево выполняется в Java в 10 раз быстрее.
Синтаксис и читаемость
Синтаксис Java похож на синтаксисы C и С++. У всех этих языков достаточно строгий и «многословный» синтаксис, и для новичков это минус: вместо того чтобы сосредоточиться на том, что писать, приходится больше думать о том, как писать. Впрочем, от витиеватости языка страдают не только новички. Большая часть работы программиста — это работа с уже написанным кодом, поэтому читаемость очень важна.
В Python синтаксис очень лаконичный, а код минималистичный и хорошо читается.
Применение
Java — лидер в разработке мобильных приложений, а ещё хорошо подходит для десктопных приложений, промышленных программ и программ для корпораций.
Python — замечательный выбор для машинного обучения, автоматизации, искусственного интеллекта и веб-разработки.
Python vs. JavaScript
Типизация
В Python строгая типизация. Как мы писали выше, несмотря на то что это достаточно гибкий язык, у него есть свои границы. В JavaScript слабая типизация: она даёт большую свободу, но из-за этого могут возникать ошибки или просто странные выражения.
Основные недостатки языка Python
Язык программирования Python славится своей простотой и лаконичностью. Немногословный и понятный синтаксис, похожий на псевдокод, а также сильная динамическая типизация способствуют быстрому и безболезненному обучению новичков.
Интерпретатор языка берёт на себя всю низкоуровневую работу, освобождая программиста от необходимости ручного управления памятью. Практическая невозможность получить segmentation fault, а также удобная система исключений, снабжённая понятными сообщениями, позволяют оперативно отлаживать программы. Ситуации, когда их падения из-за возникшей ошибки требуют глубокого дебаггинга, достаточно редки.
Непереполняемые целые числа и безопасность при работе с контейнерами стандартной библиотеки делают из Python хорошее средство предварительного прототипирования идей, а большое число высококачественных математических библиотек обуславливают лидерство этого языка в области машинного обучения, анализа данных и научных вычислений.
Более искушённые программисты ценят этот язык за удобные средства для построения пайплайнов отложенных, или как ещё говорят — ленивых, вычислений. В Python эта функциональность реализуется итераторами и т.н. генераторами. Библиотека асинхронного программирования также довольно хороша.
Но не всё с этим языком легко и просто. Помимо специфического архитектурного решения под названием GIL, воплощённого в основном интерпретаторе языка CPython и связанных с ним проблем с эффективностью многопоточности, Питону присущи и более фундаментальные недостатки, сильно ограничивающие область его применения.
Скорость
В общем, недостаток в скорости ограничивает область применения этого языка задачами, в которых время операций ожидания ответа на запрос многократно превышает время работы тела скрипта. Среди них можно выделить:
Почему Python медленный
Тут есть два основных фактора:
Переменная ob_refcnt отвечает за подсчёт ссылок, указывающих на данный объект. Если их количество становится равным нулю, это становится сигналом для сборщика о том, что память, занимаемую этим объектом, можно освободить. ob_type указывает на тип данного объекта. Плюс к этому, если объект владеет сущностью нефиксированного размера, указатель на тип дополняется указателем на область памяти, где эта сущность хранится, и переменной, отвечающей за её размер.
Современные процессоры оптимизированы для работы со значениями, хранящимися в памяти последовательно и непрерывно. Искоренение промахов кэша, а также подстраивание под предсказатель переходов является неотъемлемой частью разработки быстрых программ.
Что касается языка Python, то он компилируется в байт-код, а не в инструкции процессора. Значит, предсказатель переходов тут становится бессилен.
Динамика
Как мы видим, безопасность, которая обеспечивается моделью памяти языка Python, сводит на нет большое число возможных процессорных оптимизаций. Тем не менее знающие читатели могут заметить, что, например, в Java все объекты, за исключением примитивных типов, так же аллоцируются на куче, но код на этом языке работает гораздо быстрее. Так почему бы интерпретатору Питона не реализовать оптимизации, присущие виртуальной машине Java, — например, копцепцию JIT-компиляции?
Во-первых, это динамическая типизация
Данное словосочетание означает тот факт, что переменная, объявленная в этом языке, не имеет привязанного к ней типа. То же самое касается сигнатур функций и полей классов.
Писать что-то подобное возможно только в динамически типизированных языках:
Эти возможности приводят к тому, что разработчик имеет меньше гарантий корректной работы программы на уровне системы типов. Обширный класс ошибок, отлавливаемых в статически типизированных языках на этапе компиляции, возникает в Питоне уже на этапе рантайма, что ставит его в проигрышное положение по сравнению с ними, — по крайней мере, при поддержке большой кодовой базы.
Вторая такая особенность — это пространство имён.
В Питоне переменная, будучи объявленной, не обязана прекращать существование после выхода из родного блока отступов. Например, следующий код является рабочим:
Третьим фактором является широкая гибкость в динамическом переопределении процесса создания объектов. В Питоне возможно такое:
Этот код требует пояснения. Дело в том, что в Питоне все сущности, существующие в рантайме, являются объектами. Объекты, в свою очередь, являются реализациями, или как их ещё называют — инстансами, классов. Но классы же ведь тоже являются объектами.
Как вы можете догадаться, те сущности, инстансами которых являются классы, называются метаклассами.
Подробнее о метаклассах вы можете почитать тут.
Ну и наконец, четвёртой сложностью является возможность создавать классы динамически.
Выводы
В данной статье были рассмотрены два основных недостатка языка Python, а именно: его малое быстродействие и недостаточные возможности статического анализа кода. Эти проблемы взаимосвязаны, и решение последней автоматически откроет дорогу для решения первой.
Уже сейчас в мире существуют динамически типизированные языки с опциональной компиляцией, основанной на уточнении типов. Самым интересным из них, на мой взгляд, является Julia. Возьмут ли разработчики CPython его пример на вооружение — покажет время.
Как бы то ни было, язык Python является отличным инструментом для быстрого написания кода. Его широкие динамические возможности, а также понятность и, я не побоюсь этого слова, красота синтаксиса обуславливают то, что процесс составления программ на нём действительно вызывает удовлетворение. Тем не менее, как и любой инструмент, этот язык имеет свои недостатки и о них полезно помнить перед началом своих проектов.
Использование Python в веб-разработке: плюсы и минусы
За годы своего существования Python развился в динамичный, гибкий и очень мощный язык программирования. Многие разработчики предпочитают использовать для работы именно его, а не такие традиционные варианты, как C++ и Java. И среди веб-разработчиков Python тоже очень популярен. Но поскольку сообщество не имеет единого мнения о том, насколько эффективно использовать Python для создания богатых функционалом сайтов, давайте взвесим плюсы и минусы такого выбора.
Только сперва давайте обратим внимание на ведущие сайты и популярные веб-платформы, успешно использующие Python.
Если посмотреть на приведенные примеры, становится ясно, что Python прекрасно подходит для создания самых разнообразных веб-проектов. И совсем не удивительно, что он используется для создания сайтов для различных направлений, включая путешествия, администрирование, образование, развлечения, здравоохранение, социальные медиа.
Но несмотря на многочисленные достоинства Python, многие разработчики все-таки для своих проектов выбирают другие языки программирования. Поэтому мы будем рассматривать не только плюсы, но и минусы использования Python.
Преимущества использования Python для веб-разработки
Давайте начнем с основных преимуществ, которые предлагает Python веб-разработчикам.
Простота использования
Одна из самых привлекательных черт языка Python — невероятная простота использования в веб-проектах. Дальше мы расскажем, с чем это связано.
Легкость изучения
Этот язык программирования изучить не сложнее, чем самый обиходный английский. Простой синтаксис языка обеспечивает очень пологую кривую обучаемости.
Отлично подходит для визуализации данных
Когда речь заходит о представлении данных на сайте или в приложении, Python просто потрясающе эффективен, и разработчики не могли этого не оценить. С его помощью можно легко создавать простые и понятные отчеты и визуальные представления данных.
Легкость чтения
Простой синтаксис Python обеспечивает разработчикам отличную читаемость кода. Благодаря этому разработчикам, занятым в проекте, проще коммуницировать и обмениваться знаниями.
Несравненная гибкость
Асинхронное программирование
Все мы знаем, что шаблоны асинхронного программирования помогают решать многие проблемы, с которыми время от времени сталкиваются разработчики. Python поддерживает асинхронный код. А когда разные части программы могут работать отдельно друг от друга, это помогает выявлять и решать возникающие проблемы гораздо быстрее.
Минусы использования Python в веб-разработке
Несмотря на все преимущества, перечисленные выше, Python имеет также некоторые серьезные ограничения. Давайте коротко по ним пройдемся.
Заключение
По большому счету, преимущества языка Python перевешивают его недостатки. И он, благодаря своей непревзойденной гибкости, простоте использования и модульности, для многих разработчиков остается самым предпочтительным вариантом выбора.
«За что вы так меня не любите?» (с) Python
Python уже на протяжении нескольких лет держится в топе языков программирования. А любая популярная вещь так или иначе обречена на шквал критики разной степени конструктивности. IT-сообщество разделилось на три основных лагеря:
те, кто Python боготворят;
те, кто делают вид, как будто его не существует, или о нём практически не слышали;
те, кто ненавидит Питон всем сердцем.
И под влиянием общепринятого человечеством правила, когда на негативное мы обращаем гораздо больше внимания, в этой статье (скорее небольшом эссе из категории «Мысли на тему») я решил обсудить пять основных причин, за которые язык Python ненавидят и критикуют.
Скорость
Наверное, каждый слышал, что Python медленный и уступает в скорости другим языкам по типу С++, С# и т.д.
Отрицать это глупо, однако дьявол, как обычно, в деталях. Python интерпретируемый язык, он по определению не заточен под разработку проектов, специфика которых требует межгалактической скорости. Если используют для других целей и проектов. Там, где это нужно, все узкие, критические для производительности места и библиотеки (например, Numpy) обычно пишут на С или Fortran и оборачивают в питон-код. А в большинстве оставшихся мест это скорость-то особо не нужна или не сильно критична. Кстати, если всё-таки кровь из носу нужно повысить производительность, никто не запрещает использовать другие реализации интерпретатора, например, PyPy, Stackless, Numba и т.д.
К слову, Python далеко не самый медленный язык по сравнению с конкурентами в «своей весовой категории», взять те же PHP и Ruby.
На мой взгляд, судить о крутости и применимости языка исключительно по скорости, это тоже самое, что судить о качестве программы по количеству строчек кода. Разные инструменты, лучше использовать в разных условиях. Если бы краеугольным камнем всего было бы исключительно быстродействие, тогда мы вполне могли бы обойтись ассемблером, а хипстеры, для которых ассемблер казался бы слишком сложным, использовали бы Си.
Ниша Python – это веб, скриптинг и Data Science. Он хорош именно в этих сферах. Если тебе нужны сложные вычисления, CPU-bound задачи, то тебе надо смотреть в сторону свеженького Rust или С/С++. Никто не заставляет писать highload на Питоне. Поэтому попытки ругать Python за скорость схожи с ситуацией, когда ты покупаешь кроссовки на два размера меньше и ругаешь потом фирму за то, что в кроссовках их производства неудобно ходить. Или пытаешься гонять в футбол в свадебных туфлях с носами. Ну вы поняли.
Другая аналогия. Не надо сверлить зуб пациента перфоратором. В смысле, конечно, можно, но будет ли доволен хоть кто-то из вас двоих после этого? Когда инженеры придумывали дрель, они не задумывались, как люди могли бы с помощью неё рыбачить. Продолжать эту цепочку можно довольно долго.
И вы, наверное, удивитесь, что Python обгоняет многие языки программирования по своей скорости, скорости разработки на нём. А это на некоторых проектах гораздо важнее выигрыша в несколько секунд.
Проблемы с многопоточностью и GIL (запрещенная на территории РФ организация)
Как уже оговаривалось раньше, исходя из специфики применения, Python может позволить себе плохо работать с потоками. Кстати, если ты не особо понимаешь, о чем мы сейчас говорим, у меня на YouTube канале есть видео про GIL, рекомендую ознакомиться.
Если тебе обязательно нужно миллион виртуальных потоков, то просто используй Elixir, Erlang или Go. Они с прицелом на это и создавались. Зачем ты ругаешь дуршлаг за то, что вода из него утекает? Ругать надо себя, если ты, будучи «крутым прогером», не способен подобрать подходящий инструмент или перестроиться под особенности задачи.
Допустим, в процессе обработки запроса будет сделано несколько обращений, к API, к базе данных или кэшу. Сервера могут быть сколь угодно быстрыми, но всё упрётся в скорость передачи данных по сети и ожидание ответов от сервисов. В I/O-bound задачах (на которых Python и применят чаще всего) потоки питона отлично работают, для CPU-bound Python и не предназначен. Кстати, в альтернативу потокам без каких-либо ограничений можно плодить процессы. Да, они заметно тяжеловеснее, однако при грамотном менеджменте и работе с ресурсами можно добиться довольно эффективной работы. Просто надо немного подумать, это вам не просто библиотеки импортировать)
Низкий порог вхождения
Не сказал бы, что это ужасный минус. Но большинство людей говорят, что Python плодит низкоквалифицированных разработчиков, которые способны только импортить библиотеки, где всё уже сделано за них и всё готово. Знаете, еду из ресторанов, пакетиков, Макдоналдса и другого фастфуда готовить тоже не надо. Всё уже собрано, разложено и пожарено. Надо лишь заказать, сделать импорт, если вам угодно. Только вот почему-то не все люди используют готовую пищу. Многие готовят самостоятельно, зачастую сильно заморачиваются в поисках качественных продуктов, способа приготовления, стараются питаться правильно и экологично. Однако они могут позволить себе съесть фастфуд или заказные блюда в редких случаях, зачастую под какой-то повод или, например, вынуждено перекусить на ходу.
Тот компетентный человек, который разбирается, например, в нейронных сетях, знает алгоритмы, когда лучше какие применять, понимает, как грамотно подобрать гиперпараметры, с большой долей вероятности сможет самостоятельно написать собственную реализацию любой модели из библиотеки. Только вот зачем ему тратить на это время? А вот парень, который ничего не понимает, не собирается разбираться, просто насмотрелся видео на YouTube и бездумно импортит модули, так он и программистом работать не сможет, потому что на каждом шагу будет упираться в свою некомпетентность и рано или поздно ему это надоест.
Безусловно, на трушных инженерах и стоит весь мир. Всё, что у нас есть сейчас, мы имеем благодаря хардкорщикам, считавшим в своё время байты на ассемблере и С. Эти люди были, есть и будут востребованы, однако сейчас бизнес также охотно платит и тем, кто может просто качественно выполнять свою работу, собирая софт из фреймворков и модулей, не делая всё с нуля, банально из-за того, что это быстрее, а время сейчас – это деньги.
Отдельно можно выделить большое количество расплодившихся быдло-кодеров на YouTube (неловко оглядывается в зеркало) и других площадка, которые использует в качестве основы Python. Но поймите, дело тут не в питоне. Python довольно простой язык, поэтому привлекает большое количество народа, и если вдруг, в ближайшее время появится что-то более простое и удобное, эта контингентная прослойка моментально бросит питон. То есть дело, как обычно в самих людях.
При этом из-за низкого порога вхождения, постоянно идёт приток новых разработчиков в комьюнити. За счёт чего оно растёт и развивается. Ведь никому не нравится хочется столкнуться с нечто подобным.
Скриншот сделан 12.04.2021
Синтаксис
Часто люди не согласны мириться с синтаксисом Python, в особенности с пробелами. Выглядит чужеродно и неудобно. Я некоторое время преподавал программирование в заведениях дополнительного школьного образования.
Давайте сравним, как я пишу код на С++:
И как его пишут дети:
Теперь как я пишу код на Python:
И как его пишут дети:
То-то и оно. К пробелам можно привыкнуть за пару дней, а взамен за моральные страдания, вы получите чётко структурированный, лаконичный, легко читаемый программный код, причём он такой у всех программистов, независимо от их уровня. Кстати, у меня на канале также есть видео о том, как научиться ставить пробелы и табы в Python. Если ты новичок, советую ознакомиться.
А вообще, объективно говоря, на вкус и цвет товарищи разные. Думаю, про синтаксис мы закончили.
Типизация
Это одновременно и плюс, и минус. С одно стороны, безусловно, динамическая типизация тянет проблемы в очень крупных проектах и затрудняет тестирование. С другой же, проще даётся новикам, что обеспечивает приток новой крови в сообщество. Также динамическая типизация дает и несколько других бонусов в виде упрощения метапрограммирования, плюшек интроспекции и рефлексии. Также в Python 3.5 появились аннотации типов – type hinting. Да, это не панацея уровня TypeScript, но указание типов стало довольно приятным нововведением, значительно облегчившим жизнь, и программисты очень часто стали им пользоваться.
Если вы не согласны со мной или вам есть что добавить, то милости прошу в комментарии.
Заключение
Подытожить всё выше сказанное хочется фразой Страуструпа, создателя С++:
«Есть всего два типа языков программирования: те, на которые люди всё время ругаются, и те, которые никто не использует».
И, как я сказал в начале текста:
«Python уже несколько лет держится в топе языков программирования».
Почему Python — плохой выбор для первого языка программирования?
Так как я веду несколько технических групп и чатов, то часто сталкивался с вопросом от подписчиков о том, с какого же языка лучше начать изучать программирование и информатику. Очень часто кто-то советует именно Python. Я в корне не согласен с этим советом. Мне нравится этот язык, и я ничего не имею против него, он прост и удобен. Но есть кое-какие аргументы против того, чтобы поставить его на место вашего первого языка программирования. Оговорюсь, что всё сказанное далее является субъективным мнением автора и не претендует на истину.
Итак, почему…
Ниже на картинке я привел пример, как можно с помощью маленькой функции обработать матрицу и вернуть структуру, соответствующую транспонированной матрице.
Транспонирование матрицы — это операция над матрицей, при которой ее строки и столбцы меняются местами. Кто уже начинал изучать аналитическую геометрию (линейную алгебру), тот сталкивался с этой простейшей задачей. Иногда это задание дают на уроках информатики в качестве сложных задач на обработку двумерных массивов, которые мы и называем матрицами. Что ж, кому-то может показаться и вовсе несложным. Однако, для большинства начинающих и людей, не сталкивающихся с программированием, понять, что такое двумерный/многомерный массив — это непростая задача. Вы можете не поверить, но есть много очень замудренных задач на обработку многомерных массивов, над которыми придется подумать даже опытному разработчику.
Есть другие языки, более низкого уровня, которые помогут вам понять глубину, понять базу, понять структуру, снять розовые очки, убрать синтаксический сахар и как следует подумать над теми вещами, которые ранее вы принимали как должное. Какой из этого вывод? Если вы хотите научиться думать, по-настоящему понимать как работает железо, то лучше начать с низкого уровня. Поэтому полезнее будет начать с Assembler или C.
Во-первых, это даст вам лучшее представление о том, как работает процессор и периферийная электроника в вашем ПК.
Во-вторых, вы начнете понимать сообщения об ошибках в операционной системе.
В-третьих, последующие языки высокого уровня, базирующиеся на крепком фундаменте низкоуровневых основ, покажутся вам более прозрачными и понятными в обращении.
Думаю, что можно еще привести кучу плюсов к тому, чтобы начать с низкого уровня. Зачастую, люди, изучающие Python, по привычке подключают в свой код кучу библиотек ради реализации каких-то простейших функций. Логично предположить, что это сильно утяжеляет код и делает его медленным. А если еще вспомнить, что даже эффективно написанный python-код примерно в 1000 раз медленнее аналогичного кода на C/C++, то представьте себе какая производительность в итоге получится. Конечно же не всем разработчикам нужно писать ПО, которое работает в режиме реального времени и требует мгновенных реакций с минимальными задержками. Не всем нужно писать ААА-игры.
Тем не менее, обратите внимание на текущую ситуацию в программном обеспечении. Если раньше нужно было 8-битный процессор, чтобы запустить спутник в космос, то сейчас у нас тормозит несколько вкладок в браузере при 2-4 ядерном 64-битном CPU. Так может быть причина как раз в разработчиках, а не в «слабом» железе?
Самый ранний из найденных космических аппаратов, в которых стояли не микросхемы средней степени интеграции, а именно монолитный микропроцессор (8-битный RCA 1802) – это спутник Magsat, запущенный 30 октября 1979 года.
В завершении хотелось бы сказать, что все языки программирования — это великие достижения в IT-области. Но чтобы нам стать настоящими профессионалами и экспертами, всё равно придется узнать то, с чего всё начиналось, вспомнить об истоках, математике, алгоритмах, ассемблере и даже об электронике и физике. Все знания должны сплетаться в вашей голове в единую картину, в крепкую логическую цепочку. Последнюю получится построить только тогда, когда мы начнем от корня технологий, начнем с самого нижнего уровня.
Напишите в комментариях, согласны ли вы с такой идеей? Или же вы придерживайтесь другого подхода?