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

Contenu connexe

Tendances

Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программированияAlexander Petrov
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в ОблакеGeeksLab Odessa
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython Meetup
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Быстрое прототипирование алгоритмов управления
Быстрое прототипирование алгоритмов управленияБыстрое прототипирование алгоритмов управления
Быстрое прототипирование алгоритмов управленияMATLAB
 
2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vw2012.11.06 машинное обучение с помощью vw
2012.11.06 машинное обучение с помощью vwИлья Трофимов
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Денис Колодин: Low-latency и soft-realtime на Python
Денис Колодин: Low-latency и soft-realtime на PythonДенис Колодин: Low-latency и soft-realtime на Python
Денис Колодин: Low-latency и soft-realtime на Pythonit-people
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusMikhail Kurnosov
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
 
Введение в потоки питона
Введение в потоки питонаВведение в потоки питона
Введение в потоки питонаAndrey Niahajchyk
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Ontico
 

Tendances (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/с++ надежнее и безопаснее (К...
 

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

Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времениTatyanazaxarova
 
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#Andrey Karpov
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"
Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"
Лекция №1. Введение. Предмет "Структуры и алгоритмы обработки данных"Nikolay Grebenshikov
 
Как сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееКак сделать ваш JavaScript быстрее
Как сделать ваш JavaScript быстрееRoman Dvornov
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Ontico
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
 
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actualYevgen Levik
 
практика 12
практика 12практика 12
практика 12student_kai
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиTatyanazaxarova
 
практика 3
практика 3практика 3
практика 3student_kai
 
язык програмирования
язык програмированияязык програмирования
язык програмированияOlegmingalev1997
 

Similaire à Борзунов Александр, 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
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 

Plus de Darya Zubova

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

Plus de 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