23
cpmoptimize Автоматическая оптимизация алгоритмов в Python Автор: Александр Борзунов, студент ИМКН УрФУ

Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Embed Size (px)

Citation preview

Page 1: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

cpmoptimize

Автоматическая оптимизация алгоритмовв Python

Автор: Александр Борзунов,студент ИМКН УрФУ

Page 2: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Простой пример

Задача. Вычислить N-ое число Фибоначчи.

Page 3: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Простой пример

Тривиальный алгоритм:

N = 10 млн

25 минут 31 секунда

Ускоренный алгоритм:

18 секунд

(в 85 раз быстрее)

Page 4: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Теория

Рассмотрим такой язык программирования:• Имеется несколько числовых переменных• С ними можно производить операции:

x = y

x = 5

x += y

x += 6

x -= y

x -= 7

x *= 8

• Используется интересный метод, описанный Александром Скидановым в 2012 году

Page 5: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Теория

• Для выполнения программ на этом языке можно хранить вектор переменных, дополненный единицей:

• Описанные операции можно выполнять, домножая вектор на некоторую матрицу.

Page 6: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Теория• Присваивание другой переменной (x = y):

• Присваивание константы (x = 5):

Page 7: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Теория• Прибавление другой переменной (x += y):

• Домножение на константу (x *= 8):

Page 8: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Теория• Исполнение нескольких операций друг за другом:

• Самое интересное – циклы:

• Если использовать бинарное возведение в степень, то можно выполнять циклы значительно быстрее (не за O(n), а за O(log n) *)

* — при условии, что каждая итерация цикла работает за одинаковое время

Page 9: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Теория

Page 10: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Переходим к реализации

• Практически применимой реализации описанного метода с матрицами не существовало.

• Я решил реализовать этот метод для языка Python.

Поставленные задачи:

• Простота в использовании

• Требуется, чтобы декоратор ни при каких условиях не мог «сломать» программу

Page 11: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Идея

• Сейчас компиляторы умеют заменять операции на более эффективные, предсказывать значения выражений, удалять или менять местами части кода.

• Задача создания эффективного кода частично переносится на компиляторы и интерпретаторы.

• Но компиляторы ещё не заменяют сам алгоритм вычислений на асимптотически более эффективный.

x * 4 x << 2

Page 12: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Пример: длинные циклыЗадача. Вычислить N-ый член последовательности, соответствующей правилу:

• Интуитивно понятно, как появляется очередной член последовательности, однако требуется время, чтобы придумать соответствующую математическую формулу.

Page 13: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Пример: длинные циклы• При использовании декоратора компьютер сам придумает, как быстро считать ответ на нашу задачу:

При N = 101000:

445 мс

Page 14: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Пример: линейно-рекуррентные соотношения

• Тогда придётся либо потратить усилия на составление и реализацию быстрого алгоритма, либо написать тривиальное решение и воспользоваться декоратором.• В обоих случаях производительность программ получится почти одинаковой.

• Помимо чисел Фибоначчи, иногда требуется быстро вычислять значения более сложных рекуррентных формул:

Page 15: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Почему именно Python?

+ Байт-код можно анализировать и изменять без вмешательства в интерпретатор

+ Преимущества метода с матрицами особенно проявляются при наличии длинной арифметики

‒ Проверки типов, выполняемые из-за динамической типизации

‒ Компиляторы C++ могли бы создавать ещё более быстрые программы

Page 16: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Описание библиотеки

cpmoptimize - compute the power of a matrix and optimize

cpmoptimize.xrange(…)

• Замена стандартному xrange, поддерживающая long

cpmoptimize.cpmoptimize(strict=False, iters_limit=5000, …)

• Можно указать, в каких случаях стоит применять оптимизацию, и что делать, когда применить её не удалось

Page 17: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Алгоритм работы декоратора

I. Этап применения декоратора:

1. Найти следующий цикл for

2. Проверить, что тело цикла состоит только из допустимых операций

3. Преобразовать тело цикла в список элементарных операций с ограниченным кругом переменных

4. Установить перед циклом «ловушку»

Page 18: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Выражения и вынос кода за цикл

• Декоратор определит, что значения k и m в выражении (k ** m) & 676 не зависят от того, на какой итерации цикла они используются, а значит значение всего выражения можно вычислить один раз перед циклом.

• Код справа уже можно оптимизировать с помощью матриц.

Page 19: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Алгоритм работы декоратораII. Этап срабатывания «ловушки»:

1. Проверим, что объект, по которому проходится цикл, и используемые переменные имеют нужные типы (это можно сделать только в run-time)

2. Если проверка не удалась, то оптимизацию применить нельзя и нужно запустить исходный байт-код цикла

3. Иначе построим необходимые матрицы

4. Возведём их в степень

5. Присвоим переменным конечные значения

Page 20: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Что ещё можно реализовать?• Замена операций (требуется сохранение

ассоциативности умножения матриц или подобного свойства):

Пример:

• Поддержка вложенных циклов

• Обработка предсказуемых условий

Page 21: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Установка и документация

• Установить библиотеку можно одной командой:

$ sudo pip install cpmoptimize

• Если прописать её в зависимостях у своего проекта, при установке через pip она докачается автоматически.

Хабрахабрhttp://habrahabr.ru/post/236689/

GitHubhttps://github.com/borzunov/cpmoptimize

Python Package Indexhttps://pypi.python.org/pypi/cpmoptimize

Page 22: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Вопросы?

Page 23: Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

Спасибо за внимание!