Автоматическая оптимизация кода на уровне АСТ
Project description
Astrologic. Автоматическая оптимизация кода на уровне АСТ
Пакет Astrologic содержит ряд инструментов, позволяющих "в рантайме" оптимизировать работу ваших функций или даже конструировать новые функции. Все это достигается за счет парсинга и преобразования ACT исходной функции. Парсинг происходит полностью "под капотом" и невидим для пользователя.
Оглавление
Быстрый старт
Установите Astrologic через pip:
$ pip install astrologic
Включаем и отключаем блоки кода
Простейшим из декораторов библиотеки Astrologic является @switcher
. Вот пример его использования:
from astrologic import switcher
@switcher(a=False, b=True)
def function():
print('begin')
if a:
print('block a')
if b:
print('block b')
print('end')
function() # Что будет выведено? Проверьте сами!
@switcher
проходится по унарным условиям (условиям, в которых только один операнд). Если название переменной, которая фигурирует в данном условии, присутствует в именованных аргументах самого декоратора, он делает одну из двух вещей. Если именованный аргумент равен True, он достает данный блок кода из условия заменяет им само условие. Если аргумент равен False, он удаляет условие вместе с блоком кода. То есть функция из примера выше превращается в:
# Тот код, который будет исполнен на машине. Блок кода "if a:" полностью вырезан, а блок "if b:" вытащен из проверки, в то время как сама проверка тоже вырезана.
def function():
print('begin')
print('block b')
print('end')
Использовать данный декоратор вы можете, к примеру, чтобы избежать каких-то проверок в вашем коде, основанных на константах. При инициализации функций в начале работы интерпретатора вы указываете, какие блоки кода вам нужны. По сути, if'ы в данном случае служат не по прямому назначению, а работают разметкой кода.
Поскольку @switcher
редактирует функции на уровне АСТ, в некоторых случаях применение декоратора может ускорить ваш код, полностью убрав ненужные операции из реально исполняемого машиной кода.
У @switcher
есть ряд ограничений и правил использования, которые необходимо учитывать:
- Декоратор
@switcher
должен быть первым в списке декораторов, все остальные можно накладывать только поверх. Если не соблюсти это правило, декораторы, лежащие под@switcher
, могут просто исчезнуть, будто их не было. - Никаких else или else if у блоков if, которыми вы управляете через декоратор! У прочих блоков if использовать else можно, поскольку они никаких не модифицируются.
Оптимизация хвостовой рекурсии
Еще один крутой трюк с ACT - автоматическая оптимизация хвостовой рекурсии. Для этого нам понадобится декоратор @no_recursion
:
from astrologic import no_recursion
counter = 0
@no_recursion
def recursion():
global counter
counter += 1
if counter != 10000000:
return recursion()
return counter
print(recursion()) # Попробуйте выполнить это сами!
Как вы, вероятно, знаете, максимальная глубина рекурсии в Python ограничена, и обычно составляет около 1000. Однако код из этого примера отработает и вернет корректный результат, поскольку декоратор @no_recursion
автоматически преобразовал рекурсивный код в итеративный.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for astrologic-0.0.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 89a94345ca067c9f6b1b680471d03bc55a53564e75041d8e3c98f33d3defe824 |
|
MD5 | 55fe2c3e2dca90442cf94f82ebbe4041 |
|
BLAKE2b-256 | c58dfdf7b678d7170c7fce597d991970135be1710b1816ff879b7d489822a597 |