Найти в Дзене
ZDG

ChatGPT научил как ускорить Python, программисты пишут и нахваливают

Надеюсь, эти идиотские заголовки радуют вас :) В прошлый раз я сравнивал время выполнения различных методов на Питоне и на JS: Меня неприятно (по отношению к Питону) удивил тот факт, что JS-код исполнялся в 50 раз быстрее такого же на Питоне. Но у него есть один секрет. JIT Это означает Just In Time Compiler. Обычный компилятор просто вдумчиво компилирует программу. В отличие от него JIT занимается компиляцией прямо во время выполнения, то есть совмещает функции интерпретатора и компилятора. Читайте также: Деятельность JIT разбита на несколько стадий. Что там у Питона? Отвечает ChatGPT. Сейчас технология JIT есть у многих языков, поэтому наверняка она должна быть и у Питона. Можно было обратиться в Гугл, но я спросил у ChatGPT. Я всё чаще пользуюсь им вместо Гугла, потому что он банально даёт нужный результат проще и быстрее. Вот, например, выдача Гугла по запросу "python jit": Сразу и не сообразишь, куда тыкать, да? А вот ответ от ChatGPT: Из которого сразу стало понятно, что надо про
Оглавление

Надеюсь, эти идиотские заголовки радуют вас :)

В прошлый раз я сравнивал время выполнения различных методов на Питоне и на JS:

Меня неприятно (по отношению к Питону) удивил тот факт, что JS-код исполнялся в 50 раз быстрее такого же на Питоне. Но у него есть один секрет.

JIT

Это означает Just In Time Compiler.

Обычный компилятор просто вдумчиво компилирует программу. В отличие от него JIT занимается компиляцией прямо во время выполнения, то есть совмещает функции интерпретатора и компилятора.

Читайте также:

Деятельность JIT разбита на несколько стадий.

  • Сначала по ходу выполнения программы делается анализ, определяются самые нагруженные и часто используемые места.
  • Затем эти места компилируются – то есть компиляция применяется не ко всей программе, а только к её кускам.
  • После компиляции получается код в формате LLVM – Low Level Virtual Machine, т.е. низкоуровневой виртуальной машины. Данный код может учитывать конкретную архитектуру, на которой он запускается, и поэтому по производительности приближается к настоящему машинному коду.
  • Далее куски программы подменяются скомпилированным кодом LLVM, и вот получено значительное ускорение. JIT продолжает следить за поведением программы, и если она начала выполнять какие-то другие куски, то он скомпилирует и их.

Что там у Питона? Отвечает ChatGPT.

Сейчас технология JIT есть у многих языков, поэтому наверняка она должна быть и у Питона. Можно было обратиться в Гугл, но я спросил у ChatGPT. Я всё чаще пользуюсь им вместо Гугла, потому что он банально даёт нужный результат проще и быстрее.

Вот, например, выдача Гугла по запросу "python jit":

Сразу и не сообразишь, куда тыкать, да?

А вот ответ от ChatGPT:

-2

Из которого сразу стало понятно, что надо пробовать Numba и PyPy.

Numba

Тут не получилось абсолютно ничего. Для начала надо установить пакет numba:

pip install numba

А затем декорировать вычислительные функции специальным образом:

-3

С виду всё просто, но у меня вылезли ошибки компиляции из-за того, что некоторые инструкции в программе оказались неподходящими для numba. А когда я их переделал, то результат оказался ещё медленнее, чем без numba. Удивительно, правда? Я не стал углубляться дальше.

PyPy

Это просто отдельная версия транслятора python, которая заменяет обычный Питон.

Я скачал архив отсюда:

Download and Install
-4

А потом просто заменил всю папку, в которой установлен Питон, папкой из архива. И... всё, ничего не сломалось, программы продолжили работать как обычно. (Но рекомендую сохранить старую папку, если что-то пойдёт не так.)

Поправочка: модули, установленные в Питоне, не работают в PyPy – их надо устанавливать отдельно. При этом возможны проблемы с совместимостью.

Новые замеры времени показали ошеломительные результаты:

-5

Напомню, что это время в секундах. Если раньше оно составляло 0.5, то теперь 0.005. Иначе говоря, достигнуто ускорение в 100 раз.

При этом разница между тестами стала совсем мизерная, и тогда я увеличил размер матрицы до 4096 * 4096:

-6

Теперь разница более заметная (и более быстрые тесты по-прежнему лидируют), и всё равно общая скорость выросла многократно.

В общем, рекомендую :)