Прочее
June 27

Mojo внутри Python: убийца или лучший друг?

Разбираем реальный кейс и перспективы

Я уже не раз иронизировал на тему "убийцы Python" — языка Mojo, который с момента своего анонса обещал нам золотые горы и производительность в 35 000 раз выше. Что ж, похоже, лёд тронулся. Недавно создатель языка Крис Латтнер объявил, что теперь код на Mojo можно вызывать напрямую из Python.

В интернетах появился отличный эксперимент, который наглядно показывает, что мы имеем на текущий момент: дико перспективную технологию или сырую поделку? Спойлер: и то, и другое.

Как это работает?

Первое, что радует — порог входа стал ниже. Установка теперь делается через uv в одну команду, что уже прогресс по сравнению с первыми версиями.

Чтобы создать быструю функцию для Python, нужно:

  1. Написать её в файле .mojo, обернув в специальный экспортный код.
  2. В 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:

  • Чистый Python: ~0.45 секунды
  • NumPy: ~0.26 секунды
  • Mojo: ~0.011 секунды

Mojo оказался быстрее чистого Python примерно в 40 раз, и быстрее NumPy — в 20 раз.

И вот это уже очень серьёзная заявка. Обогнать NumPy, который под капотом использует оптимизированный код на C, в 20 раз — это впечатляет. Особенно если учесть, что синтаксис Mojo действительно проще для изучения, чем Rust или C++.

Что мы имеем в сухом остатке? Как будто есть потенциал. Идея получить язык, который синтаксически близок к Python, но даёт производительность на уровне (а иногда и выше) компилируемых языков, звучит заманчиво.

Не можешь победить — присоединись 🤪