Mojo… Будущий убийца Python
Python используется для решения огромного количества задач, но у него есть одна большая проблема - скорость. Эта ситуация может измениться благодаря Mojo.
На связи команда DS Арсений Рыбаков, Александра Османкина и Никита Тюгаев.
Mojo — это новый язык программирования, который, по сути, является надмножеством Python, как TypeScript и JavaScript.
Он устраняет имеющиеся у него проблемы производительности и развертывания, а, по заявлениям разработчиков, в некоторых задачах обгоняет Python в 35 000 раз.
Вдобавок, за Modular, разработчиками Mojo, стоит Крис Латтнер, создатель языка программирования Swift и компилятора LLVM, который облегчил разработку новых мощных ЯП (Rust, Julia), что заставляет быть еще более уверенным в успехе Mojo.
Проблемы Python
Python - прекрасный язык, с большим количеством областей применения. Он доминирует в области Data Science, обладает огромным количеством фреймворков, что надежно закрепляет его в инструментарии современного разработчика.
Так почему бы не использовать его при решении всех задач? Просто он в несколько тысяч раз медленнее, чем C-подобные языки :) Это делает непрактичным его использование для чувствительных к производительности частей кода, но у Python есть одно неоспоримое преимущество: он может обращаться к коду, написанному на быстрых языках, таких, как C, позволяя программистам Python чувствовать себя как в родной среде, даже если они используют высокооптимизированные числовые библиотеки. Но и у такого подхода существуют неизбежные проблемы с производительностью: приходится иметь дело с невозможностью эффективной параллельной обработки в Python, а также с отсутствием слияния, то есть множества скомпилированных функций подряд приводят к накладным расходам.
Как Mojo может решить эти проблемы?
Создать быстрый, а также простой и гибкий в использования язык программирования, который будет лишен проблем Python, очень сложно, однако Modular, кажется, имеют все шансы на успех.
В первую очередь, Mojo – язык, разработанный для программирования на графических процессорах, что крайне важно для разработок в области искусственного интеллекта. В качестве “фундамента” Mojo использует гибкую инфраструктуру для современных оптимизирующих компиляторов MLIR, которая позволяет разработчикам Mojo извлечь все преимущества векторов, потоков и аппаратных устройств искусственного интеллекта.
Память управляется аналогично Rust через систему владения с набором правил, которые проверяются компилятором, при нарушении которых программа не будет скомпилирована. Это никак не замедляет скорость работы программы, но повышает безопасность. Также поддерживается ручное управление, как в C++.
Все это делает Mojo невероятно эффективным в использовании ресурсов, однако есть еще одно важное преимущество. Он разработан как надмножество Python, таким образом, не придется изучать другой язык. Mojo полностью совместим и может взаимодействовать с экосистемой Python, что означает поддержку популярных библиотек.
Но это еще не все, есть и новый функционал, например: статическая типизация (вы все еще можете использовать динамические типы, но статические необходимы для оптимизации) и наличие возможности у разработчика в любой момент перейти в более быстрый «режим», используя «fn» вместо «def» для создания своей функции. В этом режиме нужно явно объявить тип каждой переменной, и в результате Mojo сможет создать оптимизированный машинный код для реализации функции. Более того, если используется «struct» вместо «class», атрибуты будут плотно упакованы в память, поэтому их можно будет использовать даже в структурах данных, не гоняясь за указателями. Именно этот функционал позволяет языкам C быть настолько быстрыми, а теперь он доступен и для разработчиков на Python, нужно просто изучить немного нового синтаксиса.
Тесты и сравнения
Начнем с простого, вычислим сумму арифметической прогрессии, используя цикл for.
Вот так будет выглядеть наш код на Python:
Получим следующее:
А так на Mojo:
sum = 500000000500000000
mojo_execution_time = 82 nanoseconds
По итогам тестирования можем установить, что Mojo считает сумму арифметической прогрессии от 0 до 1 000 000 000 быстрее Python почти в 1 000 000 000 раз! При этом, чем больше элементов, тем больше разница между соревнующимися. Естественно, эта задача мало похожа на реальную, но она показывает, насколько быстро Mojo может работать с циклами.
Теперь попробуем что-нибудь сложнее, например, вычисление числа π.
Python:
pi = 3.1415926534900813
python_execution_time = 73357328653.33557 nanoseconds
Mojo:
pi = 3.1415926534900813
mojo_execution_time = 11596816608 nanoseconds
В этот раз разница не такая существенная, но все также ощутима, Python медленнее в 500 раз.
Ну и наконец, умножение матриц, одна из операций, на основе которой Modular демонстрируют преимущества своей разработки.
Сначала реализуем алгоритм умножения матриц на Python исходя из определения.
Давайте протестируем нашу реализацию используя квадратные матрицы 128x128 и вычислим скорость в гигафлопсах.
python_gflops = 0.0016717199881536883 GFLOP/s
Теперь реализуем на Mojo:
Функция умножения матриц:
Алгоритм бенчмарка:
13.978696 GFLOP/s, в 8361.864443 раз быстрее Python
Наблюдаем ускорение более чем в 8 000 раз в таком непростом алгоритме.
Однако, если использовать torch:
python_gflops = 19.74407991241765 GFLOP/s
Видим, что Mojo оказался медленнее в 1.41244 раз. К сожалению, использовать torch с Mojo для дополнительных тестов пока нет возможности.
Все тесты проводились на ЦП.
Заключение
Протестировав Mojo, можно сделать как минимум один вывод, Python без использования сторонних библиотек медленнее, причем заметно. Конечно, новые языки и фреймворки появляются постоянно и не все из них становятся востребованными и популярными, да и Mojo еще находится в очень раннем развитии, но, кажется у него есть все шансы стать востребованным у современных разработчиков.