Mojo внутри Python: убийца или лучший друг?
Разбираем реальный кейс и перспективы
Я уже не раз иронизировал на тему "убийцы Python" — языка Mojo, который с момента своего анонса обещал нам золотые горы и производительность в 35 000 раз выше. Что ж, похоже, лёд тронулся. Недавно создатель языка Крис Латтнер объявил, что теперь код на Mojo можно вызывать напрямую из Python.
В интернетах появился отличный эксперимент, который наглядно показывает, что мы имеем на текущий момент: дико перспективную технологию или сырую поделку? Спойлер: и то, и другое.
Как это работает?
Первое, что радует — порог входа стал ниже. Установка теперь делается через uv
в одну команду, что уже прогресс по сравнению с первыми версиями.
Чтобы создать быструю функцию для Python, нужно:
- Написать её в файле
.mojo
, обернув в специальный экспортный код. - В Python-скрипте импортировать специальный
max.mojo.importer
, после чего можно импортировать свой mojo-модуль как обычный.
Выглядит это всё ещё немного громоздко, но уже вполне реально. Но давайте к самому интересному — к тестам производительности.
Цель: понять, можно ли использовать Mojo как замену C/Rust/Cython для ускорения "тяжёлых" вычислений в Python-проектах.
Тест №1: Факториал. Классический провал
Первый тест был простым — вычисление факториала. На малых числах Mojo показал себя чуть быстрее. Но как только автор эксперимента попробовал вычислить factorial(100)
, Mojo вернул 0.
Причина понятна — переполнение целочисленного типа. Mojo, как и многие компилируемые языки, использует типы данных фиксированного размера (например, 64-битное целое). Python же по умолчанию использует длинную арифметику, позволяя работать с целыми числами практически неограниченного размера.
Это идеальная иллюстрация того, что Mojo — это не "улучшенный Python". Это другой язык со своими правилами и своими, более низкоуровневыми, компромиссами.
Тест №2: Простые числа. Неожиданный триумф
Если на факториале Mojo сел в лужу, то на вычислительно сложной задаче — подсчёте простых чисел — он показал себя во всей красе. Автор написал три одинаково наивных реализации: на чистом Python, на NumPy и на Mojo.
Результаты для подсчёта простых чисел до 20 000:
Mojo оказался быстрее чистого Python примерно в 40 раз, и быстрее NumPy — в 20 раз.
И вот это уже очень серьёзная заявка. Обогнать NumPy, который под капотом использует оптимизированный код на C, в 20 раз — это впечатляет. Особенно если учесть, что синтаксис Mojo действительно проще для изучения, чем Rust или C++.
Что мы имеем в сухом остатке? Как будто есть потенциал. Идея получить язык, который синтаксически близок к Python, но даёт производительность на уровне (а иногда и выше) компилируемых языков, звучит заманчиво.
Не можешь победить — присоединись 🤪