Докладчик:
Владимир Донец (kwimba.ru)
Описание: Слышали про магию в Python? Одно из магических заклинаний называется дескрипторы. Мощная фича языка, которая позволяет определять свое поведение атрибута объекта при доступе к этому атрибуту.
Сложно звучит? А вы знали, что дескрипторами уже наверняка пользовались, если хотя бы раз писали на Python. Я расскажу о том, что такое дескрипторы и как их осознанно можно применять в собственном коде.
Докладчик:
Александр Сапронов
Описание:
Мы рассмотрим популярные библиотеки для функционального программирования на Python — fn.py, functools, itertools, funcy, hask, Toolz. Узнаем возможности каждой из библиотеки, а также как в динамическом язык имитировать мощную систему типов. Затронем характеристики функционального программирования и проверим помогают ли библиотеки выполнить.
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
Измерение времени работы кода на Python с помощью модулей timeit, cProfile и line_profiler. Немного о NumPy. JIT и AOT компиляция кода на Python на примере Numba и Cython.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.
Докладчик:
Владимир Донец (kwimba.ru)
Описание: Слышали про магию в Python? Одно из магических заклинаний называется дескрипторы. Мощная фича языка, которая позволяет определять свое поведение атрибута объекта при доступе к этому атрибуту.
Сложно звучит? А вы знали, что дескрипторами уже наверняка пользовались, если хотя бы раз писали на Python. Я расскажу о том, что такое дескрипторы и как их осознанно можно применять в собственном коде.
Докладчик:
Александр Сапронов
Описание:
Мы рассмотрим популярные библиотеки для функционального программирования на Python — fn.py, functools, itertools, funcy, hask, Toolz. Узнаем возможности каждой из библиотеки, а также как в динамическом язык имитировать мощную систему типов. Затронем характеристики функционального программирования и проверим помогают ли библиотеки выполнить.
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
Измерение времени работы кода на Python с помощью модулей timeit, cProfile и line_profiler. Немного о NumPy. JIT и AOT компиляция кода на Python на примере Numba и Cython.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
Два протокола итераторов: __next__ + __iter__ и __getitem__. Итераторы и цикл for, а также операторы in и not in. Генераторы, оператор-выражение yield. Генераторы как: итераторы, сопрограммы, менеджеры контекста. Модуль itertools.
При написании программы, разработчик примерно представляет себе, как должна работать его программа. Но не всегда его ожидания соответствуют действительности — приложения тормозят, потребляют много ресурсов и вообще ведут себя не так, как задумывалось, особенно под большой нагрузкой. В своём докладе я покажу, как заглянуть "под капот" ваших приложений на Python (и Django в частности): какие способы профилирования бывают и когда их можно использовать, расскажу об отладке приложений и различных инструментах, которые помогают разработчику при разработке.
Зачем тестировать? Тестирование в интерпретаторе и доктесты. Модуль unittest. Пакет py.test - на порядок лучше. Тестирование свойств и пакет hypothesis.
Модули threading, queue и concurrent.futures. Использование потоков для параллельных вычислений на Python. GIL. Параллельность и конкурентность. Модуль asyncio. Модуль multiprocessing.
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Доклад вводит в рассмотрение универсальный адаптер, позволяющий обернуть любой класс с целью добавления новых свойств, отсутствующих в оригинальном классе. Получаемые классы могут иметь в точности такой же интерфейс, как и первоначальные, что позволяет прозрачно заменять их и оборачивать любое количество раз.
Это позволяет добавлять необходимые свойства объектам, не переписывая его с нуля. Предложенная обобщенная концепция будет последовательно введена и проиллюстрирована простыми, но интересными примерами.
Лекция 4. Строки, байты, файлы и ввод/вывод.Roman Brovko
Строковые литералы и сырые строки. Строки и Юникод. Основные методы работы со строками. Модуль string. Байты. Кодировки. Файлы и файловые объекты. Методы работы с файлами. Модуль io
Синтаксис объявления классов. Атрибуты, связанные и несвязанные методы, __dict__, __slots__. Статические методы и методы класса. Свойства, декоратор @property. Наследование, перегрузка методов и функция super. Декораторы классов. Магические методы.
Презентация со встречи сообщества SPb Python Interest Group рассказывающая об устройстве словарей в Python.
В презентации рассмотрена работа словаря в CPython 2.x, словаря в CPython 3.x, а также рассмотрены изменения в CPython 3.6.
Помимо CPython рассмотрены версии словаря в альтернативных реализациях Python, таких как PyPy, IronPython и Jython.
Лекция 5. Встроенные коллекции и модуль collections.Roman Brovko
И снова встроенные коллекции: кортеж, список, множество, словарь - обход в глубину, обзор методов, примеры. Почти всё про модуль collections: именованные кортежи, счётчики, defaultdict, OrderedDict.
Лекция 7. Исключения и менеджеры контекста.Roman Brovko
Исключения, зачем они нужны и как их обрабатывать. Встроенные исключения и базовые классы BaseException и Exception. Операторы try...except..else..finally. Менеджеры контекста и модуль contextlib.
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
Два протокола итераторов: __next__ + __iter__ и __getitem__. Итераторы и цикл for, а также операторы in и not in. Генераторы, оператор-выражение yield. Генераторы как: итераторы, сопрограммы, менеджеры контекста. Модуль itertools.
При написании программы, разработчик примерно представляет себе, как должна работать его программа. Но не всегда его ожидания соответствуют действительности — приложения тормозят, потребляют много ресурсов и вообще ведут себя не так, как задумывалось, особенно под большой нагрузкой. В своём докладе я покажу, как заглянуть "под капот" ваших приложений на Python (и Django в частности): какие способы профилирования бывают и когда их можно использовать, расскажу об отладке приложений и различных инструментах, которые помогают разработчику при разработке.
Зачем тестировать? Тестирование в интерпретаторе и доктесты. Модуль unittest. Пакет py.test - на порядок лучше. Тестирование свойств и пакет hypothesis.
Модули threading, queue и concurrent.futures. Использование потоков для параллельных вычислений на Python. GIL. Параллельность и конкурентность. Модуль asyncio. Модуль multiprocessing.
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
Web-программирование
Лекция #5. Введение в язык программирования Python 3
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Доклад вводит в рассмотрение универсальный адаптер, позволяющий обернуть любой класс с целью добавления новых свойств, отсутствующих в оригинальном классе. Получаемые классы могут иметь в точности такой же интерфейс, как и первоначальные, что позволяет прозрачно заменять их и оборачивать любое количество раз.
Это позволяет добавлять необходимые свойства объектам, не переписывая его с нуля. Предложенная обобщенная концепция будет последовательно введена и проиллюстрирована простыми, но интересными примерами.
Лекция 4. Строки, байты, файлы и ввод/вывод.Roman Brovko
Строковые литералы и сырые строки. Строки и Юникод. Основные методы работы со строками. Модуль string. Байты. Кодировки. Файлы и файловые объекты. Методы работы с файлами. Модуль io
Синтаксис объявления классов. Атрибуты, связанные и несвязанные методы, __dict__, __slots__. Статические методы и методы класса. Свойства, декоратор @property. Наследование, перегрузка методов и функция super. Декораторы классов. Магические методы.
Презентация со встречи сообщества SPb Python Interest Group рассказывающая об устройстве словарей в Python.
В презентации рассмотрена работа словаря в CPython 2.x, словаря в CPython 3.x, а также рассмотрены изменения в CPython 3.6.
Помимо CPython рассмотрены версии словаря в альтернативных реализациях Python, таких как PyPy, IronPython и Jython.
Лекция 5. Встроенные коллекции и модуль collections.Roman Brovko
И снова встроенные коллекции: кортеж, список, множество, словарь - обход в глубину, обзор методов, примеры. Почти всё про модуль collections: именованные кортежи, счётчики, defaultdict, OrderedDict.
Лекция 7. Исключения и менеджеры контекста.Roman Brovko
Исключения, зачем они нужны и как их обрабатывать. Встроенные исключения и базовые классы BaseException и Exception. Операторы try...except..else..finally. Менеджеры контекста и модуль contextlib.
Где кончается react native? / Павел Кондратенко (Rambler&Co)Ontico
РИТ++ 2017, Frontend Сonf
Зал Мумбаи, 5 июня, 11:00
Тезисы:
http://frontendconf.ru/2017/abstracts/2496.html
В своем выступлении я расскажу про то, как библиотека бумажных книг в нашей компании переехала в онлайн и причем тут react native. Погружаясь в архитектуру этой технологии я постараюсь дать представление о том, что можно выжать из нее и где заканчиваются ее возможности. Разберем потоки в приложении, возможные проблемы и все это на таких простых примерах как ActivityIndicator.
Если у вас еще не дошли руки до react native, но всегда хотели разобраться - приходите обязательно! Из моего доклада вы сможете, как минимум, получить представление об этой технологии.
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
Let's calculate an average of one column for each key, like the following query: SELECT key, avg(value) FROM table GROUP BY key. What can be more simple? But the question is: what is the most efficient way to do it? How to write code to achieve maximum performance on a variety of hardware?
Мы все допускаем ошибки при программировании и тратим массу времени на их устранение.
Один из методов который позволяет быстро диагностировать дефекты – статический анализ исходного кода.
Языки C, C++ и C++0x как набор ножей по дереву. С их помощью создаются великолепные изделия, но немного неаккуратности и можно глубоко порезаться. Одной из самых ранних методик обнаружения ошибок в коде программ является статический анализ кода. Запуская анализ сразу после написания нового кода или во время ночных сборок, можно выявить множество ошибок еще до этапа тестирования. Это сокращает стоимость и время их исправления. Также могут быть обнаружены дефекты, редко проявляющие себя, которые могут являться головной болью на протяжении многих месяцев сопровождения программы.
В докладе будет продемонстрировано множество примеров ошибок в известных open source программах и библиотеках, которые можно обнаружить с помощью статических анализаторов.
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
разработка серверов и серверных приложений лекция №3etyumentcev
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
Similar to Оптимизация производительности Python (20)
Докладчик: Данил Руденко
О докладе:
По некоторым оценкам, больше половины профессий будет автоматизировано – это и есть максимальный объём, на который может быть увеличен рынок алгоритмов машинного обучения, ярчайшем представителем которого являются нейронные сети.
В докладе мы поговорим об общей концепции нейронных сетей, рассмотрим основные Python - фреймворки для машинного обучения, а также реализуем решение задачи классификации изображений с применением Keras.
Докладчик: Данил Руденко
О докладе:
У нашего зоопарка опять проблемы, которые необходимо решить максимально технологично!
На первом докладе мы поговорили о сверточных нейронных сетях, в этот раз рассмотрим такие виды нейронных сетей как автоэнкодеры и GAN’ы( генеративные состязательные сети). Также углубимся немного в Keras, напишем кастомный загрузчик данных и немного посмотрим на Jupyter Notebook.
Видео: https://youtu.be/tu-ee_4uAGY
Asyncio для процессинга распределенной базы данныхPyNSK
Докладчик: Никита Семенов
О докладе:
Появление asyncio стало новой вехой в истории питона. По-настоящему удобный и эффективный способ запускать асинхронный код.
В своем докладе я познакомлю слушателя с базовым синтаксисом, парадигмами и примитивами, чтобы можно было начать использовать всю мощь asyncio уже сегодня.
Для этого я возьму децентрализованные базы данных с web-интерфейсом, раскиданные по нескольким серверам, и покажу как их можно эффективно запроцесить только при помощи стандартных методов питона 3.4+ и aiohttp.
Видео: https://youtu.be/rpiHVA6vRTY
Докладчик: Станислав Каблуков
О докладе:
Расскажу о своём опыте использования Python для разработки игр. В каких игровых движках и программах для моделирования используется Python.
Как и почему стоит использовать python для создания игр, и в каких случаях лучше отказаться от данной идеи. О плюсах и минусах использования Python.
В докладе будет про: python, blender, Ren'py, KivEnt, Boo, UE4 и д.р.
Видео: https://youtu.be/2RrZx_J5twU
Python инструменты для нагрузочного тестированияPyNSK
В докладе я расскажу об использовании yandex.tank с BFG и locustio для нагрузочного тестирования.
Докладчик: Иван Гребенщиков
Видео: https://youtu.be/-kWm5V9pyCY
Python, Django и корпоративные информационные системыPyNSK
Софт для автоматизации бизнеса составляет значительную часть всего существующего на планете программного обеспечения. Рассмотрим требования к нему и особенности его разработки. Оценим, насколько Python для этого подходит, и облегчают ли фреймворки жизнь в кровавом энтерпрайзе.
Докладчик: Анатолий Щербаков
Видео: https://youtu.be/G_ks3sO1Mbs
Как показать релевантный текст для пользователя? Собрать данные, написать разные тексты, а потом написать кучу IF'ов?
В докладе я расскажу, как мы, в Welltory, делаем настройку контента под пользователя.
Поведаю о том, как content writer'ы могут писать 100 вариантов текстов на одно событие в системе.
И конечно, расскажу с чего начать вам.
Докладчик: Александр Сапронов
Видео: https://youtu.be/sG6kUxq6gDY
В докладе я расскажу об устройстве одноплатного компьютера и его периферии на примере raspbery pi.
Установку на него дистрибутива операционной системы, python 3 и управление с помощью него периферией (i2c spi uart и отдельными pin). А ещё я это покажу в живую
Докладчик: Иван Бакланов
Видео: https://www.youtube.com/watch?v=1WiIMeWHMY8
В докладе мы рассмотрим создание переносимого дистрибутива Python для любых нужд и операционных систем (Windows & Linux). Познакомимся с существующими и альтернативными решениями. Сравним их достоинства и недостатки.
Докладчик: Григорий Кареев (Odin)
Видео: https://www.youtube.com/watch?v=fvBJG_IKvaQ
Рассмотрю с практической стороны создание своего предметно-ориентированного языка. Продемонстрирую почти готовое решение возникшей задачи и расскажу, в каких случаях может потребоваться внедрение DSL.
Докладчик: Михаил Воротынцев (AgoraDoxa)
Видео: https://www.youtube.com/watch?v=Qf0TjcBG1oI
Докладчик:
Александр Сапронов
Описание:
Язык Python отлично подходит для прототипирования: простой синтаксис, множество батареек, много готовых решений. Это отлично для бизнеса и для разработчика.
Но давайте снимем розовые очки и озвучим негатив, который вас ждет, когда вы возьмете Python для проекта.
Видео:
https://www.youtube.com/watch?v=YE9Q78QlZiE
Как Python Дайджест работает с внешней статикойPyNSK
Докладчик:
Александр Сапронов
Описание:
В мини-докладе я рассмотрю простой велосипед (django-remdow), который позволяет в автоматическом режиме скачивать внешнюю статику. А также приведу простые инструменты для автоматической оптимизации вашего сайта.
Применение behave+webdriver для тестирования Web-проектовPyNSK
Докладчик:
Иван Гребенщиков
Описание:
Современные веб-проекты представляют из себя совсем не набор статических страниц, что повышает сложность их функционального тестирования.
В докладе будет рассмотрена связка инструментов behave+webdriver, способе их применения, возможные проблемы и пути их решения.
Докладчик:
Игорь Стариков
Описание:
Не секрет, что Питон, благодаря своим свойствам, имеет широчайшую область применения. Не являются исключением и мультимедийные (в том числе игровые) приложения.
В ходе этого выступления:
1. вы узнаете о некоторых средствах и принципах их построения, а также о том, как упомянутые средства могут использовать функции внешних библиотек, написанных на других языках программирования;
2. а я получу, наконец, достижение из одной известной игры, не запуская её.
Докладчик:
Александр Сапронов
Описание:
Мы вместе пройдем по популярным задачам — от парсинга сайтов до научных вычислений и рассмотрим мощь языка Python
Докладчик:
Александр Кацко
Описание:
Как только речь заходит про создание API, особенно для веб или мобильных приложений, то многие, не задумываясь, выбирают принцип REST. Но всегда ли это правильный выбор?
В докладе рассмотрим случаи, для которых хорошо подходит JSON-RPC, посмотрим примеры реализации на Django.
Докладчик:
Антон Голов
Описание:
Поговорим о некоторых функциях для интеграции TestRail c внешними системами и автоматизации деятельности QA. Будет немного про Google Docs, и некоторый набор методов работы с Testrail, рассмотрим возможности работы с системами автоматизированного тестирования.
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"PyNSK
Докладчик:
Александр Маршалов (ЦФТ)
Описание: Мы узнаем, что из себя представляет дерево синтаксического разбора (AST / Abstract Syntax Tree) в языке Python
и какие магические возможности можно получить с помощью модификации AST.
4. Мы не будем говорить:
Об «альтернативных» платформах (PyPy, MyPy, Jython, Iron Python, etc…)
4 / 216
5. Мы не будем говорить:
Об «альтернативных» платформах (PyPy, MyPy, Jython, Iron Python, etc…)
О распараллеливании алгоритмов
5 / 216
6. Мы не будем говорить:
Об «альтернативных» платформах (PyPy, MyPy, Jython, Iron Python, etc…)
О распараллеливании алгоритмов
О переписывании кода на другие языки *
* при этом мы все же немного поговорим о генерации кода на других языках на основе python-
кода
6 / 216
7. Мы не будем говорить:
Об «альтернативных» платформах (PyPy, MyPy, Jython, Iron Python, etc…)
О распараллеливании алгоритмов
О переписывании кода на другие языки *
Об объективности и правильности приводимых в докладе тестов
* при этом мы все же немного поговорим о генерации кода на других языках на основе python-
кода
7 / 216
8. Мы не будем говорить:
Об «альтернативных» платформах (PyPy, MyPy, Jython, Iron Python, etc…)
О распараллеливании алгоритмов
О переписывании кода на другие языки *
Об объективности и правильности приводимых в докладе тестов
О том, что всё, о чем вы услышите, нужно применять с умом
* при этом мы все же немного поговорим о генерации кода на других языках на основе python-
кода
8 / 216
16. 1. Микро-
оптимизации
- Инструменты
Инструменты, используемые при
микрооптимизациях
x = 1
y = 2
LOAD_CONST ((1, 2))
UNPACK_SEQUENCE 2
STORE_NAME (x)
STORE_NAME (y)
LOAD_CONST (None)
RETURN_VALUE
LOAD_CONST (1)
STORE_NAME (x)
LOAD_CONST (2)
STORE_NAME (y)
LOAD_CONST (None)
RETURN_VALUE
Модуль dis
Пример. Мы хотим узнать, какая конструкция выполняется быстрее:
Видно, что байт-код отличается на две конструкции, в первом
случае - загрузка кортежа в стек и распаковка в стек, во втором -
две загрузки целых чисел в стек.
x, y = 1, 2
16 / 216
17. 1. Микро-
оптимизации
- Инструменты
Инструменты, используемые при
микрооптимизациях
x = 1
y = 2
LOAD_CONST ((1, 2))
UNPACK_SEQUENCE 2
STORE_NAME (x)
STORE_NAME (y)
LOAD_CONST (None)
RETURN_VALUE
LOAD_CONST (1)
STORE_NAME (x)
LOAD_CONST (2)
STORE_NAME (y)
LOAD_CONST (None)
RETURN_VALUE
Модуль dis
Пример. Мы хотим узнать, какая конструкция выполняется быстрее:
Интуитивно понятно, что загрузка кортежа в стек медленней
загрузки числа в стек, и распаковка кортежа в стек медленней
загрузки одного значения в стек.
x, y = 1, 2
17 / 216
18. 1. Микро-
оптимизации
- Инструменты
Инструменты, используемые при
микрооптимизациях
x = 1
y = 2
LOAD_CONST ((1, 2))
UNPACK_SEQUENCE 2
STORE_NAME (x)
STORE_NAME (y)
LOAD_CONST (None)
RETURN_VALUE
LOAD_CONST (1)
STORE_NAME (x)
LOAD_CONST (2)
STORE_NAME (y)
LOAD_CONST (None)
RETURN_VALUE
Модуль dis
Пример. Мы хотим узнать, какая конструкция выполняется быстрее:
Поэтому видно, что второй код быстрее первого. Но, если не видно,
то есть timeit.
x, y = 1, 2
18 / 216
20. 1. Микро-
оптимизации
- Инструменты
Инструменты, используемые при
микрооптимизациях
Модуль timeit
Использование (в REPL или в python-коде):
>>> from timeit import timeit
>>>
>>> timeit("x, y = 1, 2", number=100000000)
3.349976803001482
>>>
>>> timeit("x = 1; y = 1", number=100000000)
3.125208465033211
20 / 216
21. 1. Микро-
оптимизации
- Инструменты
Инструменты, используемые при
микрооптимизациях
Модуль timeit
Использование (в ipython):
In [1]: %timeit a, b, c, d = 1, 2, 3, 4
10000000 loops, best of 3: 45.1 ns per loop
In [2]: %timeit a = 1; b = 2; c = 3; d = 4
10000000 loops, best of 3: 47.7 ns per loop
In [3]:
21 / 216
22. 1. Микро-
оптимизации
- Инструменты
Инструменты, используемые при
микрооптимизациях
Модуль timeit
Использование (в режиме командной строки):
$ python3 -m timeit -n 1000000 -r 100 "x = 1; y = 2; z = 3"
1000000 loops, best of 100: 0.0385 usec per loop
$
$ python3 -m timeit -n 1000000 -r 100 "x, y, z = 1, 2, 3"
1000000 loops, best of 100: 0.0388 usec per loop
22 / 216
23. 1. Микро-
оптимизации
- Инструменты
Инструменты, используемые при
микрооптимизациях
Модуль timeit
Использование (в режиме командной строки):
$ python3 -m timeit -n 1000000 -r 100 "x = 1; y = 2; z = 3"
1000000 loops, best of 100: 0.0385 usec per loop
$
$ python3 -m timeit -n 1000000 -r 100 "x, y, z = 1, 2, 3"
1000000 loops, best of 100: 0.0388 usec per loop
Подробнее: docs.python.org/3/library/timeit.html
23 / 216
36. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
4. "Интернирование" строк / string
interning.
In [1]: x = """()*YH)(8h3-p24f9h 98u34r-19843u_(*U _%^IG+_"""
In [2]: y = """()*YH)(8h3-p24f9h 98u34r-19843u_(*U _%^IG+_"""
In [3]: %timeit z = (x == y)
10000000 loops, best of 3: 85.3 ns per loop
In [4]: %timeit z = (x == y)
10000000 loops, best of 3: 85.1 ns per loop
In [5]: # ???
In [6]: # ???
In [7]: # ???
In [8]: %timeit z = (x == y)
10000000 loops, best of 3: 57.3 ns per loop
In [9]: %timeit z = (x == y)
10000000 loops, best of 3: 57.4 ns per loop
36 / 216
37. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
4. "Интернирование" строк / string
interning.
In [1]: x = """()*YH)(8h3-p24f9h 98u34r-19843u_(*U _%^IG+_"""
In [2]: y = """()*YH)(8h3-p24f9h 98u34r-19843u_(*U _%^IG+_"""
In [3]: %timeit z = (x == y)
10000000 loops, best of 3: 85.3 ns per loop
In [4]: %timeit z = (x == y)
10000000 loops, best of 3: 85.1 ns per loop
In [5]: import sys
In [6]: x = sys.intern(x)
In [7]: y = sys.intern(y)
In [8]: %timeit z = (x == y)
10000000 loops, best of 3: 57.3 ns per loop
In [9]: %timeit z = (x == y)
10000000 loops, best of 3: 57.4 ns per loop
37 / 216
38. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
4. "Интернирование" строк / string
interning.
>>> x = """()*YH)(8h3-p24f9h 98u34r-19843u_(*U _%^IG+_"""
>>> y = """()*YH)(8h3-p24f9h 98u34r-19843u_(*U _%^IG+_"""
>>>
>>> x == y, x is y
(True, False)
>>> id(x), id(y)
(4376204752, 4376204848)
38 / 216
39. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
4. "Интернирование" строк / string
interning.
>>> x = """()*YH)(8h3-p24f9h 98u34r-19843u_(*U _%^IG+_"""
>>> y = """()*YH)(8h3-p24f9h 98u34r-19843u_(*U _%^IG+_"""
>>>
>>> x == y, x is y
(True, False)
>>> id(x), id(y)
(4376204752, 4376204848)
>>>
>>> from sys import intern
>>> x, y = intern(x), intern(y)
39 / 216
40. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
4. "Интернирование" строк / string
interning.
>>> x = """()*YH)(8h3-p24f9h 98u34r-19843u_(*U _%^IG+_"""
>>> y = """()*YH)(8h3-p24f9h 98u34r-19843u_(*U _%^IG+_"""
>>>
>>> x == y, x is y
(True, False)
>>> id(x), id(y)
(4376204752, 4376204848)
>>>
>>> from sys import intern
>>> x, y = intern(x), intern(y)
>>>
>>> x == y, x is y
(True, True)
>>> id(x), id(y)
(4376204752, 4376204752)
40 / 216
42. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
4. "Интернирование" строк / string
interning.
Интернирование делает строки синглтонами, то есть для
каждой уникальной строки существует только один
экземпляр.
42 / 216
43. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
4. "Интернирование" строк / string
interning.
Интернирование делает строки синглтонами, то есть для
каждой уникальной строки существует только один
экземпляр.
Происходит автоматически для односимвольных строк.
43 / 216
44. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
4. "Интернирование" строк / string
interning.
Интернирование делает строки синглтонами, то есть для
каждой уникальной строки существует только один
экземпляр.
Происходит автоматически для односимвольных строк.
Происходит автоматически для идентификаторов.
44 / 216
45. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
4. "Интернирование" строк / string
interning.
Интернирование делает строки синглтонами, то есть для
каждой уникальной строки существует только один
экземпляр.
Происходит автоматически для односимвольных строк.
Происходит автоматически для идентификаторов.
Аналогичный механизм используется для чисел от -5 до 256,
эти числа также являются синглтонами.
45 / 216
46. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
4. "Интернирование" строк / string
interning.
Интернирование делает строки синглтонами, то есть для
каждой уникальной строки существует только один
экземпляр.
Происходит автоматически для односимвольных строк.
Происходит автоматически для идентификаторов.
Аналогичный механизм используется для чисел от -5 до 256,
эти числа также являются синглтонами.
В качестве операторов сравнения интернированных строк
можно использовать is и is not, что даст прирост скорости
сравнения.
46 / 216
47. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
4. "Интернирование" строк / string
interning.
The internals of Python string interning
guilload.com/python-string-interning/
47 / 216
49. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
5. "Диспатчинг" вместо каскадов условий /
dispatching
49 / 216
50. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
5. "Диспатчинг" вместо каскадов условий /
dispatching
Компенсируем отсутствие case использованием словарей.
50 / 216
51. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
5. "Диспатчинг" вместо каскадов условий /
dispatching
Компенсируем отсутствие case использованием словарей.
Рассмотрим пример:
r = 0
for i in range(10000000):
x = i % 10
if x == 0: pass
elif x == 1: r = r + 1
elif x == 2: r = r + 2
elif x == 3: r = r + 3
elif x == 4: r = r + 4
elif x == 5: r = r + 5
elif x == 6: r = r + 6
elif x == 7: r = r + 7
elif x == 8: r = r + 8
elif x == 9: r = r + 9
51 / 216
52. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
5. "Диспатчинг" вместо каскадов условий /
dispatching
Компенсируем отсутствие case использованием словарей.
Рассмотрим пример:
r = 0
for i in range(10000000):
x = i % 10
if x == 0: pass
elif x == 1: r = r + 1
elif x == 2: r = r + 2
elif x == 3: r = r + 3
elif x == 4: r = r + 4
elif x == 5: r = r + 5
elif x == 6: r = r + 6
elif x == 7: r = r + 7
elif x == 8: r = r + 8
elif x == 9: r = r + 9
Время выполнения: 4.513951063156128
52 / 216
53. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
5. "Диспатчинг" вместо каскадов условий /
dispatching
Теперь пробуем сделать то же самое с помощью словаря.
53 / 216
54. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
5. "Диспатчинг" вместо каскадов условий /
dispatching
Теперь пробуем сделать то же самое с помощью словаря.
dispatch_table = { 0: lambda r: r
, 1: lambda r: r + 1
, 2: lambda r: r + 2
, 3: lambda r: r + 3
, 4: lambda r: r + 4
, 5: lambda r: r + 5
, 6: lambda r: r + 6
, 7: lambda r: r + 7
, 8: lambda r: r + 8
, 9: lambda r: r + 9
}
r = 0
for i in range(10000000):
r = dispatch_table[i % 10](r)
54 / 216
55. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
5. "Диспатчинг" вместо каскадов условий /
dispatching
Теперь пробуем сделать то же самое с помощью словаря.
dispatch_table = { 0: lambda r: r
, 1: lambda r: r + 1
, 2: lambda r: r + 2
, 3: lambda r: r + 3
, 4: lambda r: r + 4
, 5: lambda r: r + 5
, 6: lambda r: r + 6
, 7: lambda r: r + 7
, 8: lambda r: r + 8
, 9: lambda r: r + 9
}
r = 0
for i in range(10000000):
r = dispatch_table[i % 10](r)
Время выполнения: 3.8208770751953125.
55 / 216
56. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
5. "Диспатчинг" вместо каскадов условий /
dispatching
Теперь пробуем сделать то же самое с помощью словаря.
dispatch_table = { 0: lambda r: r
, 1: lambda r: r + 1
, 2: lambda r: r + 2
, 3: lambda r: r + 3
, 4: lambda r: r + 4
, 5: lambda r: r + 5
, 6: lambda r: r + 6
, 7: lambda r: r + 7
, 8: lambda r: r + 8
, 9: lambda r: r + 9
}
r = 0
for i in range(10000000):
r = dispatch_table[i % 10](r)
Время выполнения: 3.8208770751953125.
Таким образом время выполнения снизилось на 15%.
56 / 216
57. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
6. Приведение типов
57 / 216
61. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
7. Форматирование строк
In [1]: x = "4827 f245fy24958fu204g9u240gi5 540245t 24590"
In [2]: y = "*() *Y)(u f-934u34 ut20349{)(I 09i 4309it243"
In [3]: z = "p908u54 -98u _(*U -09u 3409340t9i340it-4t-50"
In [4]:
61 / 216
62. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
7. Форматирование строк
In [1]: x = "4827 f245fy24958fu204g9u240gi5 540245t 24590"
In [2]: y = "*() *Y)(u f-934u34 ut20349{)(I 09i 4309it243"
In [3]: z = "p908u54 -98u _(*U -09u 3409340t9i340it-4t-50"
In [4]:
In [5]: %timeit "." + x + ".." + y + "..." + z + "...."
1000000 loops, best of 3: 453 ns per loop
In [6]:
62 / 216
63. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
7. Форматирование строк
In [1]: x = "4827 f245fy24958fu204g9u240gi5 540245t 24590"
In [2]: y = "*() *Y)(u f-934u34 ut20349{)(I 09i 4309it243"
In [3]: z = "p908u54 -98u _(*U -09u 3409340t9i340it-4t-50"
In [4]:
In [5]: %timeit "." + x + ".." + y + "..." + z + "...."
1000000 loops, best of 3: 453 ns per loop
In [6]:
In [7]: %timeit ".{}..{}...{}....".format(x, y, z)
1000000 loops, best of 3: 615 ns per loop
In [8]:
63 / 216
64. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
7. Форматирование строк
In [1]: x = "4827 f245fy24958fu204g9u240gi5 540245t 24590"
In [2]: y = "*() *Y)(u f-934u34 ut20349{)(I 09i 4309it243"
In [3]: z = "p908u54 -98u _(*U -09u 3409340t9i340it-4t-50"
In [4]:
In [5]: %timeit "." + x + ".." + y + "..." + z + "...."
1000000 loops, best of 3: 453 ns per loop
In [6]:
In [7]: %timeit ".{}..{}...{}....".format(x, y, z)
1000000 loops, best of 3: 615 ns per loop
In [8]:
In [9]: %timeit "".join((".", x, "..", y, "...", z, "...."))
1000000 loops, best of 3: 287 ns per loop
In [10]:
64 / 216
65. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
7. Форматирование строк
In [1]: x = "4827 f245fy24958fu204g9u240gi5 540245t 24590"
In [2]: y = "*() *Y)(u f-934u34 ut20349{)(I 09i 4309it243"
In [3]: z = "p908u54 -98u _(*U -09u 3409340t9i340it-4t-50"
In [4]:
In [5]: %timeit "." + x + ".." + y + "..." + z + "...."
1000000 loops, best of 3: 453 ns per loop
In [6]:
In [7]: %timeit ".{}..{}...{}....".format(x, y, z)
1000000 loops, best of 3: 615 ns per loop
In [8]:
In [9]: %timeit "".join((".", x, "..", y, "...", z, "...."))
1000000 loops, best of 3: 287 ns per loop
In [10]: # ???
65 / 216
66. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
7. Форматирование строк
In [1]: x = "4827 f245fy24958fu204g9u240gi5 540245t 24590"
In [2]: y = "*() *Y)(u f-934u34 ut20349{)(I 09i 4309it243"
In [3]: z = "p908u54 -98u _(*U -09u 3409340t9i340it-4t-50"
In [4]:
In [5]: %timeit "." + x + ".." + y + "..." + z + "...."
1000000 loops, best of 3: 453 ns per loop
In [6]:
In [7]: %timeit ".{}..{}...{}....".format(x, y, z)
1000000 loops, best of 3: 615 ns per loop
In [8]:
In [9]: %timeit "".join((".", x, "..", y, "...", z, "...."))
1000000 loops, best of 3: 287 ns per loop
In [10]:
In [11]: %timeit ".{0}..{1}...{2}....".format(x, y, z)
1000000 loops, best of 3: 204 ns per loop
66 / 216
67. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
- Peephole
if x in [1, 2, 3]:
x += 41 + 1
if x in (1, 2, 3):
x += 42
8. Peephole-оптимизация
Какой код выполняется быстрее?
67 / 216
68. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
- Peephole
if x in [1, 2, 3]:
x += 41 + 1
if x in (1, 2, 3):
x += 42
LOAD_NAME (x)
LOAD_CONST ((1, 2, 3))
COMPARE_OP (in)
POP_JUMP_IF_FALSE 25
LOAD_NAME (x)
LOAD_CONST (42)
INPLACE_ADD
STORE_NAME (x)
JUMP_FORWARD (to 25)
LOAD_CONST (None)
RETURN_VALUE
LOAD_NAME (x)
LOAD_CONST ((1, 2, 3))
COMPARE_OP (in)
POP_JUMP_IF_FALSE 25
LOAD_NAME (x)
LOAD_CONST (42)
INPLACE_ADD
STORE_NAME (x)
JUMP_FORWARD (to 25)
LOAD_CONST (None)
RETURN_VALUE
8. Peephole-оптимизация
Какой код выполняется быстрее?
Воспользуемся модулем dis:
68 / 216
69. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
- Peephole
if x in [1, 2, 3]:
x += 41 + 1
if x in (1, 2, 3):
x += 42
LOAD_NAME (x)
LOAD_CONST ((1, 2, 3))
COMPARE_OP (in)
POP_JUMP_IF_FALSE 25
LOAD_NAME (x)
LOAD_CONST (42)
INPLACE_ADD
STORE_NAME (x)
JUMP_FORWARD (to 25)
LOAD_CONST (None)
RETURN_VALUE
LOAD_NAME (x)
LOAD_CONST ((1, 2, 3))
COMPARE_OP (in)
POP_JUMP_IF_FALSE 25
LOAD_NAME (x)
LOAD_CONST (42)
INPLACE_ADD
STORE_NAME (x)
JUMP_FORWARD (to 25)
LOAD_CONST (None)
RETURN_VALUE
8. Peephole-оптимизация
Какой код выполняется быстрее?
Воспользуемся модулем dis:
Байт-код полностью совпадает.
69 / 216
77. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
- Peephole
sec_in_week = 7 * 24 * 60 * 60 sec_in_week = 604800
8. Peephole-оптимизация
Вы должны понимать, что оптимизации вроде
бесполезны, так как компилятор делает их сам.
77 / 216
78. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
- Peephole
- Другие
микрооптимизации
Примеры других микрооптимизаций
78 / 216
79. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
- Peephole
- Другие
микрооптимизации
Примеры других микрооптимизаций
for i in my_list:
yield i
yield from my_list
79 / 216
80. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
- Peephole
- Другие
микрооптимизации
Примеры других микрооптимизаций
for i in my_list:
yield i
func(1)
func(2)
func(3)
yield from my_list
for i in (1, 2, 3):
func(i)
.
80 / 216
81. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
- Peephole
- Другие
микрооптимизации
Примеры других микрооптимизаций
for i in my_list:
yield i
func(1)
func(2)
func(3)
x if x else y x or y
yield from my_list
for i in (1, 2, 3):
func(i)
.
81 / 216
82. 1. Микро-
оптимизации
- Инструменты
- Замена умножения
сложением
- Замена возведения в
степень умножением
- "Протяжка" констант
- "Интернирование" строк
- "Диспатчинг"
- Приведение типов
- Форматирование строк
- Peephole
- Другие
микрооптимизации
Примеры других микрооптимизаций
for i in my_list:
yield i
func(1)
func(2)
func(3)
x if x else y x or y
x == None
y != None
x is None
y is not None
yield from my_list
for i in (1, 2, 3):
func(i)
.
82 / 216
85. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
Для начала рассмотрим пример, который будем
модифицировать.
class Test(object):
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def calc(self, p):
return (self.x + self.y * p) / self.z
85 / 216
86. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
Для начала рассмотрим пример, который будем
модифицировать.
class Test(object):
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def calc(self, p):
return (self.x + self.y * p) / self.z
result = 0
test = Test(123, 456, 789)
for i in range(10000000):
result += test.calc(i)
86 / 216
87. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
Для начала рассмотрим пример, который будем
модифицировать.
class Test(object):
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def calc(self, p):
return (self.x + self.y * p) / self.z
result = 0
test = Test(123, 456, 789)
for i in range(10000000):
result += test.calc(i)
87 / 216
88. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
Для начала рассмотрим пример, который будем
модифицировать.
class Test(object):
def __init__(self, x, y, z):
self.x, self.y, self.z = x, y, z
def calc(self, p):
return (self.x + self.y * p) / self.z
result = 0
test = Test(123, 456, 789)
for i in range(10000000):
result += test.calc(i)
88 / 216
89. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
Для начала рассмотрим пример, который будем
модифицировать.
class Test(object):
def __init__(self, x, y, z):
self.x, self.y, self.z = x, y, z
def calc(self, p):
return (self.x + self.y * p) / self.z
result = 0
test = Test(123, 456, 789)
for i in range(10000000):
result += test.calc(i)
Время выполнения данного кода: 5.3768229484558105
89 / 216
91. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
1. Слоты
class Test(object):
__slots__ = "x", "y", "z"
def __init__(self, x, y, z):
self.x, self.y, self.z = x, y, z
def calc(self, p):
return (self.x + self.y * p) / self.z
result = 0
test = Test(123, 456, 789)
for i in range(10000000):
result += test.calc(i)
91 / 216
92. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
1. Слоты
class Test(object):
__slots__ = "x", "y", "z"
def __init__(self, x, y, z):
self.x, self.y, self.z = x, y, z
def calc(self, p):
return (self.x + self.y * p) / self.z
result = 0
test = Test(123, 456, 789)
for i in range(10000000):
result += test.calc(i)
Время выполнения данного кода: 4.434956073760986
92 / 216
93. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
1. Слоты
class Test(object):
__slots__ = "x", "y", "z"
def __init__(self, x, y, z):
self.x, self.y, self.z = x, y, z
def calc(self, p):
return (self.x + self.y * p) / self.z
result = 0
test = Test(123, 456, 789)
for i in range(10000000):
result += test.calc(i)
Время выполнения данного кода: 4.434956073760986
Прирост производительности относительно изначального варианта:
17.5%
93 / 216
94. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
1. Слоты
class Test(object):
__slots__ = "x", "y", "z", "__dict__"
def __init__(self, x, y, z):
self.x, self.y, self.z = x, y, z
def calc(self, p):
return (self.x + self.y * p) / self.z
result = 0
test = Test(123, 456, 789)
for i in range(10000000):
result += test.calc(i)
Время выполнения данного кода: 4.434956073760986
Прирост производительности относительно изначального варианта:
17.5%
94 / 216
106. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
4. Используем замыкания
def Test(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
result = 0
calc = Test(123, 456, 789)
for i in range(10000000):
result += calc(i)
run()
106 / 216
107. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
4. Используем замыкания
def Test(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
result = 0
calc = Test(123, 456, 789)
for i in range(10000000):
result += calc(i)
run()
Время выполнения: 2.652660846710205
107 / 216
108. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
4. Используем замыкания
def Test(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
result = 0
calc = Test(123, 456, 789)
for i in range(10000000):
result += calc(i)
run()
Время выполнения: 2.652660846710205
Прирост производительности:
относительно предыдущего варианта: 18.7%
108 / 216
109. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
4. Используем замыкания
def Test(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
result = 0
calc = Test(123, 456, 789)
for i in range(10000000):
result += calc(i)
run()
Время выполнения: 2.652660846710205
Прирост производительности:
относительно предыдущего варианта: 18.7%
относительно первого варианта: 50.7%
109 / 216
110. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
5. Используем списочную обработку вместо циклов:
map, list comprehensions, sum, и т.п...
110 / 216
111. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
5. Используем списочную обработку вместо циклов:
map, list comprehensions, sum, и т.п...
def Test(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
calc = Test(123, 456, 789)
result = sum(map(calc, range(10000000)))
run()
111 / 216
112. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
5. Используем списочную обработку вместо циклов:
map, list comprehensions, sum, и т.п...
def Test(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
calc = Test(123, 456, 789)
result = sum(map(calc, range(10000000)))
run()
Время выполнения: 2.4091830253601074
112 / 216
113. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
5. Используем списочную обработку вместо циклов:
map, list comprehensions, sum, и т.п...
def Test(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
calc = Test(123, 456, 789)
result = sum(map(calc, range(10000000)))
run()
Время выполнения: 2.4091830253601074
Прирост производительности:
относительно предыдущего варианта: 9.2%
113 / 216
114. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
5. Используем списочную обработку вместо циклов:
map, list comprehensions, sum, и т.п...
def Test(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
calc = Test(123, 456, 789)
result = sum(map(calc, range(10000000)))
run()
Время выполнения: 2.4091830253601074
Прирост производительности:
относительно предыдущего варианта: 9.2%
относительно первого варианта: 55.2%
114 / 216
115. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- ????
И вроде бы пора остановится, но...
115 / 216
116. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- ????
И вроде бы пора остановится, но...
Мы ухудшили гибкость и красоту кода, избавившись от ООП.
Хотелось бы сохранить полноценный класс, при этом получив
скорость замыканий.
116 / 216
118. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- Замыкания v2
Замыкания в методах класса
class Test(object):
__slots__ = "x", "y", "z", "calc"
def __init__(self, x, y, z):
self.x, self.y, self.z = x, y, z
self.calc = self._calc_gen(x, y, z)
@staticmethod
def _calc_gen(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
calc = Test(123, 456, 789).calc
result = sum(map(calc, range(10000000)))
run()
118 / 216
119. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- Замыкания v2
Замыкания в методах класса
class Test(object):
__slots__ = "x", "y", "z", "calc"
def __init__(self, x, y, z):
self.x, self.y, self.z = x, y, z
self.calc = self._calc_gen(x, y, z)
@staticmethod
def _calc_gen(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
calc = Test(123, 456, 789).calc
result = sum(map(calc, range(10000000)))
run()
Время выполнения: 2.4088900089263916
119 / 216
120. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- Замыкания v2
Замыкания в методах класса
class Test(object):
__slots__ = "x", "y", "z", "calc"
def __init__(self, x, y, z):
self.x, self.y, self.z = x, y, z
self.calc = self._calc_gen(x, y, z)
@staticmethod
def _calc_gen(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
calc = Test(123, 456, 789).calc
result = sum(map(calc, range(10000000)))
run()
Время выполнения: 2.4088900089263916
Прирост производительности:
относительно предыдущего варианта: 0%
120 / 216
121. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- Замыкания v2
Замыкания в методах класса
class Test(object):
__slots__ = "x", "y", "z", "calc"
def __init__(self, x, y, z):
self.x, self.y, self.z = x, y, z
self.calc = self._calc_gen(x, y, z)
@staticmethod
def _calc_gen(x, y, z):
def calc(p):
return (x + y * p) / z
return calc
def run():
calc = Test(123, 456, 789).calc
result = sum(map(calc, range(10000000)))
run()
Время выполнения: 2.4088900089263916
Прирост производительности:
относительно предыдущего варианта: 0%
относительно первоначального варианта: 55.2%
121 / 216
122. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- Замыкания v2
Замыкания в методах класса
class Test(object):
....
def _get_x(self): return self._x
def _get_y(self): return self._y
def _get_z(self): return self._z
def _set_x(self, x):
self._x = x
self.calc = self._calc_gen(x, self._y, self._z)
def _set_y(self, y):
self._y = y
self.calc = self._calc_gen(self._x, y, self._z)
def _set_z(self, z):
self._z = z
self.calc = self._calc_gen(self._x, self._y, z)
x, y, z = ( property(fget=_get_x, fset=_set_x)
, property(fget=_get_y, fset=_set_y)
, property(fget=_get_z, fset=_set_z) )
...
122 / 216
123. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- Сравнительный анализ
Сводная таблица с результатами
Описание время пред.* перв.**
Изначальный вариант 5.38
С использованием слотов 4.43 17.5% 17.5%
Вынос поиска метода за цикл 4.03 9.2% 25.1%
Избавление от глобальных переменных 3.26 19.0% 39.3%
Сохранение параметров в замыкании 2.65 18.7% 50.7%
Использование sum и map 2.41 9.2% 55.2%
Замыкания в методах класса 2.41 0% 55.2%
* - прирост производительности относительно предыдущего варианта,
** - относительно первоначального варианта
123 / 216
124. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- Сравнительный анализ
- Инструменты
Инструменты и материалы, используемые при
оптимизации
124 / 216
125. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- Сравнительный анализ
- Инструменты
Инструменты и материалы, используемые при
оптимизации
Сложность стандартных операций в Python
wiki.python.org/moin/TimeComplexity
125 / 216
126. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- Сравнительный анализ
- Инструменты
Инструменты и материалы, используемые при
оптимизации
Сложность операций в Python (подробнее)
www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
126 / 216
127. 1. Микро-
оптимизации
2. Оптимизации
- Вступление
- Слоты
- Поиск метода
- Глобальные переменные
- Замыкания
- Списочная обработка
- Сравнительный анализ
- Инструменты
Инструменты и материалы, используемые при
оптимизации
Библиотека big_O
github.com/pberkes/big_O
Позволяет оценивать сложность (в "Big O"-нотации) выполнения
python-кода на основе времени выполнения в зависимости от
входных параметров.
127 / 216
129. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Мы будем говорить о манипуляцих с кодом,
кодогенерации и дополнительных инструментах, не
подразумевающих смену платформы.
но, для начала...
129 / 216
133. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Представьте, что все оптимизации,
которые возможно автоматизировать (а
это очень многие) производились бы
автоматически при добавлении всего
нескольких строк кода в ваш проект.
133 / 216
134. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Представьте, что все оптимизации,
которые возможно автоматизировать (а
это очень многие) производились бы
автоматически при добавлении всего
нескольких строк кода в ваш проект.
И давайте порассуждаем на тему статических
оптимизаторов для python.
134 / 216
136. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Статические оптимизаторы
Тезисы:
Позволят автоматически и прозрачно для пользователя
производить над кодом различные оптимизации (в том числе
перечисленные в предыдущих частях презентации), при этом,
не "уродуя" исходный код.
136 / 216
137. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Статические оптимизаторы
Тезисы:
Позволят автоматически и прозрачно для пользователя
производить над кодом различные оптимизации (в том числе
перечисленные в предыдущих частях презентации), при этом,
не "уродуя" исходный код.
Могут быть основаны на анализе и модификации AST и/или
байт-кода.
137 / 216
138. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Статические оптимизаторы
Тезисы:
Позволят автоматически и прозрачно для пользователя
производить над кодом различные оптимизации (в том числе
перечисленные в предыдущих частях презентации), при этом,
не "уродуя" исходный код.
Могут быть основаны на анализе и модификации AST и/или
байт-кода.
Наличие таковых как минимум странно для динамического
языка.
138 / 216
139. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Статические оптимизаторы
Тезисы:
Позволят автоматически и прозрачно для пользователя
производить над кодом различные оптимизации (в том числе
перечисленные в предыдущих частях презентации), при этом,
не "уродуя" исходный код.
Могут быть основаны на анализе и модификации AST и/или
байт-кода.
Наличие таковых как минимум странно для динамического
языка.
Для python их существование невозможно без нарушения
семантики языка.
139 / 216
140. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Статические оптимизаторы
Тезисы:
Позволят автоматически и прозрачно для пользователя
производить над кодом различные оптимизации (в том числе
перечисленные в предыдущих частях презентации), при этом,
не "уродуя" исходный код.
Могут быть основаны на анализе и модификации AST и/или
байт-кода.
Наличие таковых как минимум странно для динамического
языка.
Для python их существование невозможно без нарушения
семантики языка.
Для того, чтобы возможно было их использовать, необходимо
наложить некоторые ограничения на оптимизируемый код.
140 / 216
141. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Статические оптимизаторы
Тезисы:
Позволят автоматически и прозрачно для пользователя
производить над кодом различные оптимизации (в том числе
перечисленные в предыдущих частях презентации), при этом,
не "уродуя" исходный код.
Могут быть основаны на анализе и модификации AST и/или
байт-кода.
Наличие таковых как минимум странно для динамического
языка.
Для python их существование невозможно без нарушения
семантики языка.
Для того, чтобы возможно было их использовать, необходимо
наложить некоторые ограничения на оптимизируемый код.
Пока нет готовых к полноценному использованию
статических оптимизаторов для python.
141 / 216
142. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Ограничения, налагаемые на код при использовании
статического оптимизатора:
142 / 216
143. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Ограничения, налагаемые на код при использовании
статического оптимизатора:
Должно быть очень много тестов, в идеале всё (или почти
всё) должно быть покрыть тестами.
143 / 216
144. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Ограничения, налагаемые на код при использовании
статического оптимизатора:
Должно быть очень много тестов, в идеале всё (или почти всё)
должно быть покрыть тестами.
Не должно быть других модификаторов AST и/или байт-кода.
144 / 216
145. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Ограничения, налагаемые на код при использовании
статического оптимизатора:
Должно быть очень много тестов, в идеале всё (или почти всё)
должно быть покрыть тестами.
Не должно быть других модификаторов AST и/или байт-кода.
Не должно быть динамически исполняемого кода (exec /
eval), влияющих на поток исполнения или состав объектов/
типов.
145 / 216
146. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Ограничения, налагаемые на код при использовании
статического оптимизатора:
Должно быть очень много тестов, в идеале всё (или почти всё)
должно быть покрыть тестами.
Не должно быть других модификаторов AST и/или байт-кода.
Не должно быть динамически исполняемого кода (exec /
eval), влияющих на поток исполнения или состав объектов/
типов.
Остальные ограничения сильно зависят от оптимизаторов и
оптимизаций, в качестве примеров:
146 / 216
147. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Ограничения, налагаемые на код при использовании
статического оптимизатора:
Должно быть очень много тестов, в идеале всё (или почти всё)
должно быть покрыть тестами.
Не должно быть других модификаторов AST и/или байт-кода.
Не должно быть динамически исполняемого кода (exec /
eval), влияющих на поток исполнения или состав объектов/
типов.
Остальные ограничения сильно зависят от оптимизаторов и
оптимизаций, в качестве примеров:
не должно быть подмены стандарных функций, типов и
модулей;
147 / 216
148. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
Ограничения, налагаемые на код при использовании
статического оптимизатора:
Должно быть очень много тестов, в идеале всё (или почти всё)
должно быть покрыть тестами.
Не должно быть других модификаторов AST и/или байт-кода.
Не должно быть динамически исполняемого кода (exec /
eval), влияющих на поток исполнения или состав объектов/
типов.
Остальные ограничения сильно зависят от оптимизаторов и
оптимизаций, в качестве примеров:
не должно быть подмены стандарных функций, типов и
модулей;
не должно быть перегрузки некоторых операторов для
использования со встроенными типами (литералами) *
* Например, сложение с числом какой-либо переменной не должно означать ничего, кроме
сложения с числом
148 / 216
149. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
astoptimizer
Первой известной попыткой создания статического оптимизатора
для python был проект astoptimizer
(pypi.python.org/pypi/astoptimizer).
Проект не был принят сообществом как раз из-за того, что нарушал
семантику кода, например, происходили замены вроде:
len("abc") -> 3,
при этом не учитывалось, что len можно было подменить и тогда
код становился некорректным.
149 / 216
150. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Статический оптимизатор для python, основанный на анализе и
модификации AST.
github.com/Amper/opyum
150 / 216
151. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Преимущества:
Command-line mode - отображает оптимизированный код на
основе исходного либо формирует diff между исходным:
151 / 216
152. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Преимущества:
Command-line mode - отображает оптимизированный код на
основе исходного либо формирует diff между исходным:
$ opyum diff example.py --app "ksdiff"
152 / 216
153. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Преимущества:
Command-line mode - отображает оптимизированный код на
основе исходного либо формирует diff между исходным:
$ opyum diff example.py --app "ksdiff"
153 / 216
154. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Преимущества:
Command-line mode - отображает оптимизированный код на
основе исходного либо формирует diff между исходным.
Простое использование в нескольких вариантах:
import opyum
opyum.activate()
# other imports
154 / 216
155. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Преимущества:
Command-line mode - отображает оптимизированный код на
основе исходного либо формирует diff между исходным.
Простое использование в нескольких вариантах:
import opyum
opyum.activate()
# other imports
@opyum.optimize
def function_for_optimize():
...
155 / 216
156. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Преимущества:
Command-line mode - отображает оптимизированный код на
основе исходного либо формирует diff между исходным.
Простое использование в нескольких вариантах:
import opyum
opyum.activate()
# other imports
@opyum.optimize
def function_for_optimize():
...
with opyum.activate:
# optimized imports
# other imports
156 / 216
157. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Преимущества:
Command-line mode - отображает оптимизированный код на
основе исходного либо формирует diff между исходным.
Простое использование в нескольких вариантах.
Расширяемость:
import opyum
class MyOptimization(opyum.ASTOptimization):
def visit_Node(self, node):
...
opyum.install(MyOptimization)
opyum.uninstall("CustomConstantPropagation")
157 / 216
158. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Преимущества:
Command-line mode - отображает оптимизированный код на
основе исходного либо формирует diff между исходным.
Простое использование в нескольких вариантах:
Расширяемость.
Автор :)
158 / 216
160. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Недостатки:
Те же, что и у astoptimizer (нарушение семантики языка).
160 / 216
161. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Недостатки:
Те же, что и у astoptimizer (нарушение семантики языка).
Ужасные-ужасные костыли в коде, которые позволяют
модифицировать байт-код на лету с помощью декораторов и
импорт-хуков.
161 / 216
162. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Недостатки:
Те же, что и у astoptimizer (нарушение семантики языка).
Ужасные-ужасные костыли в коде, которые позволяют
модифицировать байт-код на лету с помощью декораторов и
импорт-хуков.
Неоптимальность (выполняет отдельный проход по AST для
каждой оптмизации).
162 / 216
163. 1. Микро-
оптимизации
2. Оптимизации
3. "Мега-
оптимизации"
Вступление
Статические
оптимизаторы
opyum
Недостатки:
Те же, что и у astoptimizer (нарушение семантики языка).
Ужасные-ужасные костыли в коде, которые позволяют
модифицировать байт-код на лету с помощью декораторов и
импорт-хуков.
Неоптимальность (выполняет отдельный проход по AST для
каждой оптмизации).
Py3-only.
163 / 216