SlideShare uma empresa Scribd logo
1 de 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
Вопросы?
Спасибо за внимание!

Mais conteúdo relacionado

Mais procurados

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
ветвление.условный оператор.циклы
ветвление.условный оператор.циклыветвление.условный оператор.циклы
ветвление.условный оператор.циклы
dasha2012
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программирования
Alexander Petrov
 
лекция №16
лекция №16лекция №16
лекция №16
student_kai
 
лабораторная работа №6
лабораторная работа №6лабораторная работа №6
лабораторная работа №6
Zhanna Kazakova
 

Mais procurados (19)

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
ветвление.условный оператор.циклы
ветвление.условный оператор.циклыветвление.условный оператор.циклы
ветвление.условный оператор.циклы
 
Лекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистикиЛекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистики
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программирования
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмы
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Конкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнеры
 
Алгоритмическая конструкция следование
Алгоритмическая конструкция следованиеАлгоритмическая конструкция следование
Алгоритмическая конструкция следование
 
Защита информации семинар №3 МФТИ
Защита информации семинар №3 МФТИЗащита информации семинар №3 МФТИ
Защита информации семинар №3 МФТИ
 
лекция №16
лекция №16лекция №16
лекция №16
 
лабораторная работа №6
лабораторная работа №6лабораторная работа №6
лабораторная работа №6
 
Python
PythonPython
Python
 
Cоставной
CоставнойCоставной
Cоставной
 
Цикл
Цикл Цикл
Цикл
 
82
8282
82
 
циклы
циклыциклы
циклы
 
8 3-5
8 3-58 3-5
8 3-5
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
лабораторная работа №3
лабораторная работа №3лабораторная работа №3
лабораторная работа №3
 

Destaque

Tarantool Silverbox, Юрий Востриков
Tarantool Silverbox, Юрий ВостриковTarantool Silverbox, Юрий Востриков
Tarantool Silverbox, Юрий Востриков
Fuenteovejuna
 
Skyforge rendering tech (KRI 2014)
Skyforge rendering tech (KRI 2014)Skyforge rendering tech (KRI 2014)
Skyforge rendering tech (KRI 2014)
Sergey Makeev
 
Query expansion
Query expansionQuery expansion
Query expansion
NLPseminar
 
Электронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark ScalaЭлектронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark Scala
Roman Zykov
 
проект "РосПил". Отчет за 2011-2012 гг.
проект "РосПил". Отчет за 2011-2012 гг.проект "РосПил". Отчет за 2011-2012 гг.
проект "РосПил". Отчет за 2011-2012 гг.
ros-pil
 

Destaque (20)

Containers in a File
Containers in a FileContainers in a File
Containers in a File
 
Tarantool Silverbox, Юрий Востриков
Tarantool Silverbox, Юрий ВостриковTarantool Silverbox, Юрий Востриков
Tarantool Silverbox, Юрий Востриков
 
LinuxCon 2011: OpenVZ and Linux Kernel Testing
LinuxCon 2011: OpenVZ and Linux Kernel TestingLinuxCon 2011: OpenVZ and Linux Kernel Testing
LinuxCon 2011: OpenVZ and Linux Kernel Testing
 
Обратные фьючерсы в биткойнах
Обратные фьючерсы в биткойнахОбратные фьючерсы в биткойнах
Обратные фьючерсы в биткойнах
 
HaltDos DDoS Protection Solution
HaltDos DDoS Protection SolutionHaltDos DDoS Protection Solution
HaltDos DDoS Protection Solution
 
Skyforge rendering tech (KRI 2014)
Skyforge rendering tech (KRI 2014)Skyforge rendering tech (KRI 2014)
Skyforge rendering tech (KRI 2014)
 
PyconRu 2016. Осторожно, DSL!
PyconRu 2016. Осторожно, DSL!PyconRu 2016. Осторожно, DSL!
PyconRu 2016. Осторожно, DSL!
 
SSL/TLS: история уязвимостей
SSL/TLS: история уязвимостейSSL/TLS: история уязвимостей
SSL/TLS: история уязвимостей
 
Query expansion
Query expansionQuery expansion
Query expansion
 
Электронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark ScalaЭлектронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark Scala
 
Parallels #RIW/16 Новые разработки от идеи до релиза
Parallels #RIW/16 Новые разработки от идеи до релизаParallels #RIW/16 Новые разработки от идеи до релиза
Parallels #RIW/16 Новые разработки от идеи до релиза
 
Решение суда о запрете сайтов о Bitcoin
Решение суда о запрете сайтов о BitcoinРешение суда о запрете сайтов о Bitcoin
Решение суда о запрете сайтов о Bitcoin
 
проект "РосПил". Отчет за 2011-2012 гг.
проект "РосПил". Отчет за 2011-2012 гг.проект "РосПил". Отчет за 2011-2012 гг.
проект "РосПил". Отчет за 2011-2012 гг.
 
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Value Objects, Full Throttle (to be updated for spring TC39 meetings)Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
 
Keynote, PNW Scala 2013
Keynote, PNW Scala 2013Keynote, PNW Scala 2013
Keynote, PNW Scala 2013
 
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and GulpOptimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
 
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
 
#MBLTdev: Современная аутентификация (PayPal)
#MBLTdev: Современная аутентификация (PayPal)#MBLTdev: Современная аутентификация (PayPal)
#MBLTdev: Современная аутентификация (PayPal)
 
#MBLTdev: Kotlin для Android, или лёгкий способ перестать программировать на ...
#MBLTdev: Kotlin для Android, или лёгкий способ перестать программировать на ...#MBLTdev: Kotlin для Android, или лёгкий способ перестать программировать на ...
#MBLTdev: Kotlin для Android, или лёгкий способ перестать программировать на ...
 
Php internal architecture
Php internal architecturePhp internal architecture
Php internal architecture
 

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

Лекция №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
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
it-people
 
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOMYuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
OdessaJS Conf
 
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
corehard_by
 

Semelhante a Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень (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
 
прак 15.docx
прак 15.docxпрак 15.docx
прак 15.docx
 
практика 3
практика 3практика 3
практика 3
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
 
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOMYuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM
 
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
Этюды о буферизации: асинхронные оповещения, репликация обновлений, объединен...
 

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

  • 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