Python-привлекательный язык с хорошим сообществом для поддержки и разработки, но какова цена за эту скорость? Исследователи машинного обучения в EPFL подвергли его испытанию и обнаружили, что он не нужен.
Проблема N-queens-это давнее упражнение в алгоритмическом мастерстве. Все, что вам нужно сделать, это разместить n ферзей на шахматной доске n x n так, чтобы ни одна из ферзей не атаковала другую. Классическим и наиболее известным решением является рекурсивный подход, который позиционирует каждую королеву по очереди с учетом уже размещенных ферзей. Если в какой-либо момент ферзь не может быть помещен, функция возвращается и пытается найти новую позицию для более ранней королевы.
Реализация этого в Python, Go и C++ быстро продемонстрировала, что Python был медленным, но включал проверку ошибок, отсутствовавших в C++. Чтобы увидеть, можно ли что-то улучшить, тот же код был скомпилирован с помощью компилятора Numba Python. C++ по — прежнему был победителем с Go медленнее на 6% и Numba Python медленнее на 12%
Исследователи утверждают, что Numba Python достаточно быстр, чтобы заставить его работать в исследовательском контексте из-за скорости прототипирования кода. Go также привлекателен, но утверждается, что он имеет множество функций, которые делают его менее простым в использовании при первом эксперименте с кодом. Интересно отметить, что Юлия также находится в группе «быстро», но эта информация отнесена к приложению, где мы находим комментарий:
«Это делает Джулию потенциально привлекательной альтернативой Python/Numba. К сожалению, существуют некоторые существенные препятствия для его принятия. Во-первых, это все еще новый язык. Некоторые важные функции остаются экспериментальными, и количество сторонних библиотек ограничено, в то время как Python предоставляет доступ к множеству мощных библиотек, таких как библиотеки глубокого обучения, которые стали абсолютно центральными в нашей исследовательской деятельности. Кроме того, он имеет некоторые варианты дизайна, которые отличают его от популярных в настоящее время языков, таких как 1-индексированные массивы и множественная отправка вместо классов. Независимо от того, разумны эти решения или нет, они затрудняют переход с устоявшегося языка, такого как Python, на Джулию.»
Более реалистично, для научного использования, команда затем продолжила сравнивать параллельные реализации, которые Numba упростила, даже если стандартный Python не может использоваться таким образом. Были опробованы два подхода к распараллеливанию Python — Para и Pool, и они были сопоставлены с исходным кодом Numba и Go и C++.
Вы можете видеть, что автоматическое распараллеливание, выполняемое Numba, находится в той же лиге, что и Go и C++. Тем не менее, вы можете видеть, что C++ все еще быстрее, но не намного.
Вывод таков:
«В этом отчете мы используем хорошо известную головоломку N-queens в качестве эталона, чтобы показать, что после компиляции с использованием компилятора Numba она становится конкурентоспособной с C++ и идет с точки зрения скорости выполнения, в то же время позволяя очень быстрое прототипирование. Это справедливо как для последовательных, так и для параллельных программ. В большинстве случаев, возникающих в академической среде, поэтому имеет смысл разрабатывать на обычном Python, выявлять узкие места в вычислениях и использовать Numba для их устранения.»
Так оно и есть…