Go против Python
Python медленный, а Go быстрый. Это убеждение распространено в IT-сообществе, но на самом деле это не всегда так. В этом тексте мы сравним Python и Golang с точки зрения производительности, популярности и универсальности. И разберемся, может ли один язык победить в ближайшем будущем.
Python — это высокоуровневый язык со строгой динамической типизацией, полностью объектно-ориентирован. Это интерпретируемый язык, за счет чего программы на Python обычно отличаются повышенным потреблением памяти и низкой скоростью по сравнению с компилируемыми языками. Разработчиком языка является Гвидо ван Россум, а первая версия вышла в 1991 году.
Go — компилируемый и многопоточный язык программирования со строгой статической типизацией, созданный специально для программ, работающих под большими нагрузками на распределенных системах и многоядерных процессорах. Разработкой и поддержкой технологии занимается компания Google, а первая версия была представлена в 2009 году.
Области применения языков
Оба языка в целом являются универсальными, но есть задачи, для которых каждый из них подходит лучше в силу разных внутренних причин. Так, Golang выбирают для проектов изначально разработанных для highload с микросервисной архитектурой. Это то, для чего язык был задуман, и именно с такими задачами он справляется лучше всего.
Python часто выбирают для работы с большими данными, математическими моделями и Machine Learning (ML). Именно этот язык программирования изучают студенты физико-математических факультетов, поскольку в его экосистеме есть множество инструментов, позволяющих удобно работать с вычислениями. Однако, этим область применения Python не ограничивается. Язык создавался с прицелом на быструю разработку, и именно поэтому он так нравится бизнесу. Скорость разработки Python-приложения может в три раза превышать скорость разработки на С/С++. Плюс, у Python простой синтаксис и дружелюбное сообщество, которое помогает начинающим программистам быстро освоить технологию и начать разрабатывать.
Различия языков
Синтаксис
В Python довольно простой и лаконичный синтаксис, за счет чего код быстрее пишется и легко читается. У Go тоже чистый, но чуть более многословный синтаксис. Например:
Python
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
Golang
package main
import "fmt"
func greet(name string) {
fmt.Printf("Hello, %s!\n", name)
}
func main() {
greet("Alice")
}
Безопасность
Go — статически типизированный язык, поэтому многие ошибки обнаруживаются на этапе компиляции. Кроме того, в Go есть встроенные средства для управления ошибками и проверки безопасности типов. Python — динамически типизирован, поэтому ошибки могут вылезать уже во время выполнения программы. А это негативно влияет на безопасность. Функция ‘eval’
в Python выполняет строку как код на Python. Если пользователь может управлять вводом, передаваемым в ‘eval’
, это позволяет ему исполнять произвольный код, что открывает возможность для выполнения вредоносных команд.
Фреймворки
Python старше Go, поэтому вокруг него сформировалась обширная экосистема, включающая разные веб-фреймворки. Есть популярные фреймворки для веб-разработки, такие как Django, Flask, FastAPI, или специализированные для вычислений и машинного обучения: NumPy, SciPy, TensorFlow, PyTorch. В Go инструментарий скромнее, но тоже можно подобрать решения под задачи: Gin, Echo, Revel для веб-разработки, gRPC и Go Kit для микросервисов, Cobra для создания командных интерфейсов, Viper для работы с конфигурацией.
Скорость
Go был создан для производительных и нагруженных проектов, это компилируемый язык. Интерпретируемый Python традиционно считается медленным языком, хотя Cython или PyPy позволяют улучшить производительность, обычно до Go он не дотягивает. Плюс, в Go есть эффективное управление памятью, что тоже влияет на скорость.
Недавно мы по заказу одного из наших давних партнеров подготовили проект нового сервиса, рассчитанного на высокие нагрузки. Изначально клиент хотел сократить бюджетирование на поддержку инфраструктуры и сделать производительный сервис, рассчитанный на обработку 100 тысяч сообщений в секунду. Сервис должен был принять сообщения и обработать их по сложным правилам, а затем отправить на хранение в базу. Первоначальная обработка предполагала валидацию полных и неполных реквестов, при этом неполные сообщения нужно было обогатить за счет метаданных.
Самым узким местом был именно хендлинг сообщений, в сервис их обработки был написан на Python, который идеально подходит для работы с большими данными. Чтобы не расширять стек и не создавать проблемы с интеграцией мы решили попробовать создать и highload-сервис по приему сообщений на этом стеке. Наша команда провела исследования и написала три тестовых сервиса на Python, Golang и Rust, чтобы проверить производительность. Оказалось, что отставание Python от Go в рамках одного CPU было минимальным - до 300 сообщений в секунду, а Rust показывал значительно большую производительность. При нагрузке в 100 тысяч RPS отставание Python от Go увеличивалось в 10 раз при равном количестве сервисов. После мы начали подбирать фреймворки, которые могли бы максимально покрыть потребности для сервиса на каждом из языков. И здесь экосистема Python оказалась очень полезной, мы использовали фреймворк Granian, который написан на Rust, что позволило минимизировать framework overhead. Мы немного оптимизировали инструмент и на его основе предложили решение, которое стабильно выдерживало нужные нагрузки. Благодаря этому клиенту не пришлось сильно менять стек, искать специалистов, которые бы могли обслуживать сервис на Go, а также наше решение не потребовало дополнительных затрат на инфраструктуру. Кроме того, обслуживание нашего решения не требует особых знаний Python, с ним легко справятся специалисты middle и middle+ уровня.
Преимущества и недостатки Python и Golang
Python
К классическим преимуществам Python относят его синтаксис, на нем быстро писать, легко читать, и просто изучать, поэтому так много начинающих программистов выбирают эту технологию. За счет большого сообщества у Python очень развитая экосистема, но и стандартная библиотека покрывает множество задач, от работы с файлами до сетевого программирования и обработки данных. Традиционно Python выбирают для прототипирования из-за скорости разработки, плюс он универсален — можно использовать и для классического веба, и для ML, и для автоматизации.
Основной недостаток, это, конечно, скорость, хотя, как мы писали выше, иногда Python может выдавать отличные результаты. Автоматическая сборка мусора замедляет задачи, завязанные на управление памятью. GIL (Global Interpreter Lock) ограничивает многопоточность, отчего опять страдает производительность. И как мы упоминали выше, ошибки обнаруживаются только на этапе выполнения, поэтому тестирование и отладка становятся труднее.
Golang
Go быстрый. Сразу компилируется в машинный код, поддерживает создание многопоточных приложений через горутины, автоматически управляет памятью и вообще все в нем подчинено высокой производительности. Go создает статически связанные исполняемые файлы, которые не зависят от внешних библиотек, что упрощает деплой и переносимость приложений. В синтаксисе Go есть строгие правила, поэтому код получается чистый и легко читаемый.
Стандартная библиотека Go очень хороша, но все же менее мощная, чем у Python. И вообще экосистема развита значительно меньше, поэтому решение некоторых задач может потребовать больше времени или кастомных решений. По сравнению с Python Go менее гибкий, да, он идеален для микросервисов и highload-приложений, но статическая типизация и правила не дают такой свободы и затягивают разработку.
Миграция с Python на Golang
Главной причиной перехода с Python на Go является производительность. Классический сценарий предполагает создание MVP на Python из-за скорости разработки, но если проект начинает очень быстро расти, требуется мультизадачность и масштабирование, Go будет лучшим вариантом.
Есть разные подходы к миграции. Самый сложный — полностью переписать приложение с нуля. Это сложно, долго и дорого, зато в таком случае получится максимально оптимизировать ресурсы. Чаще выбирают гибридный подход, когда отдельные части приложения переводят на Go, а часть модулей оставляют на Python. Это проще и быстрее, чем переделывать все, проблемой может стать лишь более сложная архитектура приложения и совместимость, но опытная команда легко решит такие проблемы. Еще один подход предполагает создание оболочки вокруг Python-кода, которая позволит использовать его в приложении Go. Это самый простой, но наименее целесообразный способ — выигрыш в производительности будет минимальным.
Насколько востребованы языки Python и Go
На момент подготовки текста на hh.ru размещено 6 898 вакансий, которые требуют знания Python и всего 1386 вакансий для Golang-разработчиков. Максимальная зарплата, которую предлагают Python-программистам, согласно ресурсу, 400 тыс. рублей в месяц. Golang-разработчики могут рассчитывать на заработок до $10 тыс. до вычета налогов. При этом на ресурсе размещено 25,7 тыс. резюме от Python-разработчиков и всего 962 резюме от гоферов.
Немного другая ситуация по заработку на профильной Хабр Карьере. Там 490 открытых Python-вакансий, максимальное предложение — €15 тыс. до вычета налогов. Одновременно открыты 147 Go-вакансий с предложением от 200 тыс. рублей до $9 тыс. до налогообложения.
Такой разрыв в числе вакансий понятен — Python значительно старше Go, поэтому и проектов на нем больше. Да и выучить его успело больше людей. Golang моложе, и порог входа чуть выше, поэтому молодые разработчики нечасто выбирают его в качестве первого языка. Плюс, есть много вариантов развития карьеры даже в рамках одного стека: зарплаты специалистов Data Science и ML/DL высоки, и для них чаще выбирают именно Python.
А что думает бизнес? Пока Python тоже выигрывает.
Пока Python более востребован, на нем написано много действующих проектов, плюс компании уверены, что легко найдут сотрудников. При выборе Go-стека многие компании сталкиваются с тем, что часто стоимость разработки проектов становится выше, а хороших кадров на рынке мало, и их зарплата значительно превышает запросы Python-специалистов. Go интересный и модный, но после предварительной оценки очень многие делают выбор в пользу Python
Отметим, что самые квалифицированные специалисты обычно не выходят на свободный рынок и получают персональные предложения от HR. Однако большинство специалистов среднего уровня тоже предпочитают искать вакансии напрямую в интересующих компаниях, да и в соцсетях предложения о найме поступают нередко.
Что выбрать: Python или Go?
Однозначного ответа на этот вопрос нет. Как и в любой технологии, в каждом есть плюсы и минусы, и свои особенности, которые при неправильном планировании могут доставить много хлопот в дальнейшей поддержке проекта.
Go — это модный сейчас язык, который опытные программисты выбирают за возможности, которых нет у привычных языков. И бизнес готов за это платить - зарплаты гоферов выше, чем питонистов.
С другой стороны, Python по прежнему остается в лидерах по популярности, на нем уже написаны миллионы приложений, которым нужна поддержка. Поэтому и спрос на таких разработчиков выше. А повысить заработок можно с развитием собственных навыков.
Нашим клиентам мы советуем внимательно подойти к планированию и сравнить все возможные пути реализации, чтобы выбрать ту технологию, которая максимально будет отвечать задачам проекта. И мы готовы предоставить свою экспертизу и помочь в разработке технических требований и роадмапа.
Если вы ищете команду, которая поможет спроектировать и реализовать нагруженный проект, продумает его масштабирование, построит инфраструктуру и поможет с поддержкой, вы по адресу! Заполните форму внизу, и наш менеджер свяжется с вами в тот же день.