SlideShare a Scribd company logo
1 of 23
cpmoptimize 
Автоматическая оптимизация алгоритмов 
в Python 
Автор: Александр Борзунов, 
студент ИМКН УрФУ
Простой пример 
Задача. Вычислить N-ое число Фибоначчи.
Простой пример 
Тривиальный алгоритм: 
N = 10 млн 
25 минут 31 секунда 
Ускоренный алгоритм: 
18 секунд 
(в 85 раз быстрее)
Теория 
• Используется интересный метод, описанный 
Александром Скидановым в 2012 году 
Рассмотрим такой язык программирования: 
• Имеется несколько числовых переменных 
• С ними можно производить операции: 
x = y 
x = 5 
x += y 
x += 6 
x -= y 
x -= 7 
x *= 8
Теория 
• Для выполнения программ на этом языке 
можно хранить вектор переменных, 
дополненный единицей: 
• Описанные операции можно выполнять, 
домножая вектор на некоторую матрицу.
Теория 
• Присваивание другой переменной (x = y): 
• Присваивание константы (x = 5):
Теория 
• Прибавление другой переменной (x += y): 
• Домножение на константу (x *= 8):
Теория 
• Исполнение нескольких операций друг за другом: 
• Самое интересное – циклы: 
• Если использовать бинарное возведение в 
степень, то можно выполнять циклы 
значительно быстрее (не за O(n), а за O(log n) *) 
* — при условии, что каждая итерация цикла 
работает за одинаковое время
Теория
Переходим к реализации 
• Практически применимой реализации 
описанного метода с матрицами не 
существовало. 
• Я решил реализовать этот метод для языка 
Python. 
Поставленные задачи: 
• Простота в использовании 
• Требуется, чтобы декоратор ни при каких 
условиях не мог «сломать» программу
Идея 
x * 4 x << 2 
• Сейчас компиляторы умеют заменять операции 
на более эффективные, предсказывать 
значения выражений, удалять или менять 
местами части кода. 
• Задача создания эффективного кода частично 
переносится на компиляторы и 
интерпретаторы. 
• Но компиляторы ещё не заменяют сам 
алгоритм вычислений на асимптотически 
более эффективный.
Пример: длинные циклы 
Задача. Вычислить N-ый член последовательности, 
соответствующей правилу: 
• Интуитивно понятно, как появляется 
очередной член последовательности, однако 
требуется время, чтобы придумать 
соответствующую математическую формулу.
Пример: длинные циклы 
• При использовании декоратора компьютер сам 
придумает, как быстро считать ответ на нашу 
задачу: 
При N = 101000: 
445 мс
Пример: линейно-рекуррентные 
соотношения 
• Помимо чисел Фибоначчи, иногда требуется быстро 
вычислять значения более сложных рекуррентных формул: 
• Тогда придётся либо потратить усилия на составление и 
реализацию быстрого алгоритма, либо написать 
тривиальное решение и воспользоваться декоратором. 
• В обоих случаях производительность программ 
получится почти одинаковой.
Почему именно Python? 
+ Байт-код можно анализировать и изменять 
без вмешательства в интерпретатор 
+ Преимущества метода с матрицами 
особенно проявляются при наличии 
длинной арифметики 
‒ Проверки типов, выполняемые из-за 
динамической типизации 
‒ Компиляторы C++ могли бы создавать ещё 
более быстрые программы
Описание библиотеки 
cpmoptimize - compute the power of a matrix and optimize 
cpmoptimize.xrange(…) 
• Замена стандартному xrange, поддерживающая long 
cpmoptimize.cpmoptimize(strict=False, iters_limit=5000, …) 
• Можно указать, в каких случаях стоит применять 
оптимизацию, и что делать, когда применить её не 
удалось
Алгоритм работы декоратора 
I. Этап применения декоратора: 
1. Найти следующий цикл for 
2. Проверить, что тело цикла состоит только из 
допустимых операций 
3. Преобразовать тело цикла в список 
элементарных операций с ограниченным 
кругом переменных 
4. Установить перед циклом «ловушку»
Выражения и вынос кода за цикл 
• Декоратор определит, что значения k и m в 
выражении (k ** m) & 676 не зависят от того, на какой 
итерации цикла они используются, а значит значение 
всего выражения можно вычислить один раз перед 
циклом. 
• Код справа уже можно оптимизировать с помощью 
матриц.
Алгоритм работы декоратора 
II. Этап срабатывания «ловушки»: 
1. Проверим, что объект, по которому 
проходится цикл, и используемые 
переменные имеют нужные типы (это 
можно сделать только в run-time) 
2. Если проверка не удалась, то оптимизацию 
применить нельзя и нужно запустить 
исходный байт-код цикла 
3. Иначе построим необходимые матрицы 
4. Возведём их в степень 
5. Присвоим переменным конечные 
значения
Что ещё можно реализовать? 
• Замена операций (требуется сохранение 
ассоциативности умножения матриц или 
подобного свойства): 
Пример: 
• Поддержка вложенных циклов 
• Обработка предсказуемых условий
Установка и документация 
• Установить библиотеку можно одной командой: 
$ sudo pip install cpmoptimize 
• Если прописать её в зависимостях у своего проекта, 
при установке через pip она докачается автоматически. 
GitHub 
https://github.com/borzunov/cpmoptimize 
Хабрахабр 
http://habrahabr.ru/post/236689/ 
Python Package Index 
https://pypi.python.org/pypi/cpmoptimize
Вопросы?
Спасибо за внимание!

More Related Content

What's hot

инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программирования
Alexander Petrov
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в Облаке
GeeksLab Odessa
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
it-people
 
2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vw2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vw
Илья Трофимов
 
Денис Колодин: Low-latency и soft-realtime на Python
Денис Колодин: Low-latency и soft-realtime на PythonДенис Колодин: Low-latency и soft-realtime на Python
Денис Колодин: Low-latency и soft-realtime на Python
it-people
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Ontico
 

What's hot (19)

Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программирования
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в Облаке
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Algo 01 part01
Algo 01 part01Algo 01 part01
Algo 01 part01
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Быстрое прототипирование алгоритмов управления
Быстрое прототипирование алгоритмов управленияБыстрое прототипирование алгоритмов управления
Быстрое прототипирование алгоритмов управления
 
2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vw2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vw
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
ФИЛП
ФИЛПФИЛП
ФИЛП
 
Денис Колодин: Low-latency и soft-realtime на Python
Денис Колодин: Low-latency и soft-realtime на PythonДенис Колодин: Low-latency и soft-realtime на Python
Денис Колодин: Low-latency и soft-realtime на Python
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk Plus
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
Введение в потоки питона
Введение в потоки питонаВведение в потоки питона
Введение в потоки питона
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
 

Similar to Борзунов Александр, Cpmoptimize

Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"
Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"
Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"
Nikolay Grebenshikov
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
Michael Karpov
 
практика 12
практика 12практика 12
практика 12
student_kai
 
практика 3
практика 3практика 3
практика 3
student_kai
 

Similar to Борзунов Александр, Cpmoptimize (20)

Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
паскаль 10кл 14
паскаль 10кл 14паскаль 10кл 14
паскаль 10кл 14
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"
Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"
Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрее
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
практика 12
практика 12практика 12
практика 12
 
пр 15.docx
пр 15.docxпр 15.docx
пр 15.docx
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
прак 15.docx
прак 15.docxпрак 15.docx
прак 15.docx
 
практика 3
практика 3практика 3
практика 3
 
Python
PythonPython
Python
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 

More from Darya Zubova

Грант за организацию внеучебной деятельности 2014
Грант за организацию внеучебной деятельности 2014Грант за организацию внеучебной деятельности 2014
Грант за организацию внеучебной деятельности 2014
Darya Zubova
 
Стипендиальный конкурс 2014
Стипендиальный конкурс 2014Стипендиальный конкурс 2014
Стипендиальный конкурс 2014
Darya Zubova
 
Грант за преподавание 2014
Грант за преподавание 2014Грант за преподавание 2014
Грант за преподавание 2014
Darya Zubova
 
Стипендиальный конкурс
Стипендиальный конкурсСтипендиальный конкурс
Стипендиальный конкурс
Darya Zubova
 
стипендиальный конкурс
стипендиальный конкурсстипендиальный конкурс
стипендиальный конкурс
Darya Zubova
 
гранты преподавателям
гранты преподавателямгранты преподавателям
гранты преподавателям
Darya Zubova
 

More from Darya Zubova (16)

Денис Мустакимов. Презентация стипендиального проекта "Ai game"
Денис Мустакимов. Презентация стипендиального проекта "Ai game"Денис Мустакимов. Презентация стипендиального проекта "Ai game"
Денис Мустакимов. Презентация стипендиального проекта "Ai game"
 
Владимир Кутовой. Проектирование интерфейсов
Владимир Кутовой. Проектирование интерфейсов Владимир Кутовой. Проектирование интерфейсов
Владимир Кутовой. Проектирование интерфейсов
 
Екатерина Чаплинская. История одного тестировщика
Екатерина Чаплинская. История одного тестировщикаЕкатерина Чаплинская. История одного тестировщика
Екатерина Чаплинская. История одного тестировщика
 
Полина Зонова. Жизнь в IT с точки зрения разработчика
Полина Зонова. Жизнь в IT с точки зрения разработчикаПолина Зонова. Жизнь в IT с точки зрения разработчика
Полина Зонова. Жизнь в IT с точки зрения разработчика
 
Юлия Закс. Аналитик - кто это?
Юлия Закс. Аналитик - кто это? Юлия Закс. Аналитик - кто это?
Юлия Закс. Аналитик - кто это?
 
Александр Голубев. Менеджер разработки
Александр Голубев. Менеджер разработкиАлександр Голубев. Менеджер разработки
Александр Голубев. Менеджер разработки
 
Безопасное программирование на C#
Безопасное программирование на C#Безопасное программирование на C#
Безопасное программирование на C#
 
Петров, Трусов. ПО для робота
Петров, Трусов. ПО для роботаПетров, Трусов. ПО для робота
Петров, Трусов. ПО для робота
 
Королев Леонид. Распознавание прикосновений
Королев Леонид. Распознавание прикосновенийКоролев Леонид. Распознавание прикосновений
Королев Леонид. Распознавание прикосновений
 
Лихошерстов Валерий
Лихошерстов Валерий Лихошерстов Валерий
Лихошерстов Валерий
 
Грант за организацию внеучебной деятельности 2014
Грант за организацию внеучебной деятельности 2014Грант за организацию внеучебной деятельности 2014
Грант за организацию внеучебной деятельности 2014
 
Стипендиальный конкурс 2014
Стипендиальный конкурс 2014Стипендиальный конкурс 2014
Стипендиальный конкурс 2014
 
Грант за преподавание 2014
Грант за преподавание 2014Грант за преподавание 2014
Грант за преподавание 2014
 
Стипендиальный конкурс
Стипендиальный конкурсСтипендиальный конкурс
Стипендиальный конкурс
 
стипендиальный конкурс
стипендиальный конкурсстипендиальный конкурс
стипендиальный конкурс
 
гранты преподавателям
гранты преподавателямгранты преподавателям
гранты преподавателям
 

Борзунов Александр, Cpmoptimize

  • 1. cpmoptimize Автоматическая оптимизация алгоритмов в Python Автор: Александр Борзунов, студент ИМКН УрФУ
  • 2. Простой пример Задача. Вычислить N-ое число Фибоначчи.
  • 3. Простой пример Тривиальный алгоритм: N = 10 млн 25 минут 31 секунда Ускоренный алгоритм: 18 секунд (в 85 раз быстрее)
  • 4. Теория • Используется интересный метод, описанный Александром Скидановым в 2012 году Рассмотрим такой язык программирования: • Имеется несколько числовых переменных • С ними можно производить операции: x = y x = 5 x += y x += 6 x -= y x -= 7 x *= 8
  • 5. Теория • Для выполнения программ на этом языке можно хранить вектор переменных, дополненный единицей: • Описанные операции можно выполнять, домножая вектор на некоторую матрицу.
  • 6. Теория • Присваивание другой переменной (x = y): • Присваивание константы (x = 5):
  • 7. Теория • Прибавление другой переменной (x += y): • Домножение на константу (x *= 8):
  • 8. Теория • Исполнение нескольких операций друг за другом: • Самое интересное – циклы: • Если использовать бинарное возведение в степень, то можно выполнять циклы значительно быстрее (не за O(n), а за O(log n) *) * — при условии, что каждая итерация цикла работает за одинаковое время
  • 10. Переходим к реализации • Практически применимой реализации описанного метода с матрицами не существовало. • Я решил реализовать этот метод для языка Python. Поставленные задачи: • Простота в использовании • Требуется, чтобы декоратор ни при каких условиях не мог «сломать» программу
  • 11. Идея x * 4 x << 2 • Сейчас компиляторы умеют заменять операции на более эффективные, предсказывать значения выражений, удалять или менять местами части кода. • Задача создания эффективного кода частично переносится на компиляторы и интерпретаторы. • Но компиляторы ещё не заменяют сам алгоритм вычислений на асимптотически более эффективный.
  • 12. Пример: длинные циклы Задача. Вычислить N-ый член последовательности, соответствующей правилу: • Интуитивно понятно, как появляется очередной член последовательности, однако требуется время, чтобы придумать соответствующую математическую формулу.
  • 13. Пример: длинные циклы • При использовании декоратора компьютер сам придумает, как быстро считать ответ на нашу задачу: При N = 101000: 445 мс
  • 14. Пример: линейно-рекуррентные соотношения • Помимо чисел Фибоначчи, иногда требуется быстро вычислять значения более сложных рекуррентных формул: • Тогда придётся либо потратить усилия на составление и реализацию быстрого алгоритма, либо написать тривиальное решение и воспользоваться декоратором. • В обоих случаях производительность программ получится почти одинаковой.
  • 15. Почему именно Python? + Байт-код можно анализировать и изменять без вмешательства в интерпретатор + Преимущества метода с матрицами особенно проявляются при наличии длинной арифметики ‒ Проверки типов, выполняемые из-за динамической типизации ‒ Компиляторы C++ могли бы создавать ещё более быстрые программы
  • 16. Описание библиотеки cpmoptimize - compute the power of a matrix and optimize cpmoptimize.xrange(…) • Замена стандартному xrange, поддерживающая long cpmoptimize.cpmoptimize(strict=False, iters_limit=5000, …) • Можно указать, в каких случаях стоит применять оптимизацию, и что делать, когда применить её не удалось
  • 17. Алгоритм работы декоратора I. Этап применения декоратора: 1. Найти следующий цикл for 2. Проверить, что тело цикла состоит только из допустимых операций 3. Преобразовать тело цикла в список элементарных операций с ограниченным кругом переменных 4. Установить перед циклом «ловушку»
  • 18. Выражения и вынос кода за цикл • Декоратор определит, что значения k и m в выражении (k ** m) & 676 не зависят от того, на какой итерации цикла они используются, а значит значение всего выражения можно вычислить один раз перед циклом. • Код справа уже можно оптимизировать с помощью матриц.
  • 19. Алгоритм работы декоратора II. Этап срабатывания «ловушки»: 1. Проверим, что объект, по которому проходится цикл, и используемые переменные имеют нужные типы (это можно сделать только в run-time) 2. Если проверка не удалась, то оптимизацию применить нельзя и нужно запустить исходный байт-код цикла 3. Иначе построим необходимые матрицы 4. Возведём их в степень 5. Присвоим переменным конечные значения
  • 20. Что ещё можно реализовать? • Замена операций (требуется сохранение ассоциативности умножения матриц или подобного свойства): Пример: • Поддержка вложенных циклов • Обработка предсказуемых условий
  • 21. Установка и документация • Установить библиотеку можно одной командой: $ sudo pip install cpmoptimize • Если прописать её в зависимостях у своего проекта, при установке через pip она докачается автоматически. GitHub https://github.com/borzunov/cpmoptimize Хабрахабр http://habrahabr.ru/post/236689/ Python Package Index https://pypi.python.org/pypi/cpmoptimize