Точные реактивные записные книжки для питона для Jupyter [Lab]:
pip install ipyflowPython 3 (ipyflow) из селектора запуска или ядра.Ipyflow-это ядро Python следующего поколения для Jupyterlab и Notebook 7, которое отслеживает отношения Dataflow между символами и ячейками во время данного интерактивного сеанса, что облегчает рассуждение о состоянии ноутбука. Вот видео о том, как разговор Jupytercon представлял его (и соответствующие слайды).
Если вы хотите пропустить высоту лифта и пропустить прямо к инструкциям по установке / активации, прыгайте, чтобы быстро запустить ниже; В противном случае продолжайте читать, чтобы узнать о философии и набора функций Ipyflow.
Ipyflow обеспечивает реакционную способность Bolt-On для ядра Python по умолчанию Юпитера, ipykernel. Он был разработан с учетом следующих целей:
B зависит от ячейки A из -за ссылки на индекс x[0] и достаточно умна, чтобы не реагировать выполнять ячейку B когда какая -то другая часть x , например, x[1] , изменяется. В результате это ограничивает ненужное повторное выполнение до минимума.Чтобы установить, запустить:
pip install ipyflowЧтобы запустить ядро ipyflow, выберите «Python 3 (ipyflow)» из списка доступных ядер на вкладке запуска. Точно так же вы можете переключиться на / из ipyflow из существующего ноутбука, перейдя к элементу меню файла «Изменение ядра»:
| Входная точка | Коммутатор ядра |
|---|---|
Ipyflow поставляется с расширениями, которые обеспечивают реактивность в Jupyterlab и Notebook 7 по умолчанию, аналогично поведению выполнения, предлагаемым в других ноутбуках, таких как наблюдаемый, Pluto.jl и Marimo.
Реактивность Ipyflow ведет себя немного иначе, чем вышеперечисленное, так как она была разработана для удовлетворения потребностей пользователей Юпитера, в частности. Когда вы выполняете ячейку C с помощью iPyflow, выходы C , вывод ячеек C зависит от C, и выходные ячейки, которые зависят от C все появляются, как если бы ноутбука была выполнена сверху вниз (например, с помощью «перезапуска и пробега все»). Когда вы выбираете какую-то ячейку C , все ячейки, которые будут повторно предъявить, когда выполняется C есть оранжевая точка рядом с ними, а ячейки, которые C зависят от C, но которые являются современными и не будут повторно предъявлять фиолетовые точки:
Информация о зависимости от ячейки сохраняется в метаданных ноутбуков, так что вы можете перейти на любую ячейку после начала сеанса свежего ядра, запустить его и быть уверенным, что вывод - это то, что было задумано автором ноутбука:
Поскольку ipyflow заглядывает в состояние времени выполнения, чтобы вывести зависимости, он должен поддерживать контент в ноутбуке синхронизировать с состоянием памяти ядра, даже в обновлениях браузера. Таким образом, ipyflow позволяет по умолчанию автоматическое применение, так что состояние ядра, состояние пользовательского интерфейса в памяти и файл ноутбука на диске все синхронизировались. Если вы случайно перезаписываете вывод ячейки, который вы хотели сохранить, например, во время реактивного исполнения, и автоматическая перезаписывает предыдущий результат на диске, не бойтесь! Ipyflow предоставляет утилиту библиотеки под названием reproduce_cell для восстановления ввода и вывода предыдущих выполнений ячейки (в пределах данного сеанса ядра):
from ipyflow import reproduce_cell
reproduce_cell ( 4 , lookback = 1 ) # to reproduce the previous execution of cell 4Пример:
Если вы хотите временно отказаться от реактивного выполнения, вы можете использовать Ctrl+Shift+Enter (на Mac, CMD+Shift+Enter также работает), чтобы выполнить только рассматриваемую ячейку:
Вы также можете запустить %flow mode normal при отказа от режима реактивного выполнения по умолчанию (в этом случае CTR+SHIFT+ENTER / CMD+SHIFT+ENTER будет переключаться от нереактивного к реактивному). Чтобы восстановить реактивное выполнение по умолчанию, вы можете запустить %flow mode reactive :
Если вы хотите предотвратить реактивное поведение по умолчанию для каждого нового сеанса ядра, вы можете добавить это в свой профиль iPython (местоположение по умолчанию обычно по адресу ~/.ipython/profile_default/ipython_config.py ):
c = get_config ()
c . ipyflow . exec_mode = "normal" # defaults to "reactive" IPyflow по умолчанию в семантике в порядке , что означает, что, если ячейка B зависит от ячейки A , то A должен отображаться до B в пространственном порядке ноутбука. Ipyflow не мешает предыдущим ячеям ссылаться на данные, созданные или обновляемые более поздними ячеями, но он пропускает эти ребра при выполнении реактивного выполнения.
Семантика по порядку, хотя и менее гибкая, обладает некоторыми желательными свойствами по сравнению с семантикой любого порядка, поскольку они поощряют более чистые и более воспроизводимые ноутбуки, которые можно более легко преобразовать в сценарии Python позже. Теперь, когда я могу или не мог продавать вас в семантике в порядке, вы можете включить семантику любого порядка в ipyflow, выполнив %flow direction any_order и повторно по умолчанию семантики по умолчанию, используя %flow direction in_order :
Вы также можете обновить свой профиль ipython, если хотите сделать семантику в любом случае поведение по умолчанию для новых сеансов ядра:
c = get_config ()
c . ipyflow . flow_direction = "any_order" # defaults to "in_order"Всякий раз, когда ячейка ссылается на обновленные данные, коллапсар рядом с ней дается оранжевый цвет (аналогичный цвету для грязных клеток), а ячейки, которые (рекурсивно) зависят от него, дают фиолетовый цвет коллапсера. (Вход апельсина с фиолетовым выходом просто означает, что выход может быть вне синхронизации.) При использовании реактивного выполнения вы обычно не увидите их, поскольку вне синхронные ячейки будут автоматически повторять, хотя вы можете увидеть их, если используете Ctrl+Shift+Enter, чтобы временно отказаться от реактивности, или если вы изменяете данные, которые обновляются в клетках (тем самым перезаправленные предыдущие клетки).
Если вы хотите позволить ipyflow исправить их для вас, вы можете нажать «пространство», когда в командном режиме автоматически разрешают все устаревшие или грязные ячейки. Эта операция может ввести больше несвежих ячеек, и в этом случае вы можете продолжить нажимать «пространство», пока все несоответствия не будут разрешены, если это необходимо:
Клетки, которые ссылаются на функции и классы Python, примитивы, такие как целые числа, поплавки, строки, а также массивы Numpy, панды DataFrames и контейнеры (списки, DICTS, наборы, кортежи и т. Д.) И Ipyflow, используя Special %%memoize Pseudomagic. Нет необходимости указывать «входы» в ячейку, так как ipyflow выводит их автоматически. Запоминающие клетки кэшируют их результаты в памяти (хотя и поддерживаются диск кэши на будущее) и будут получать эти кэшированные результаты (а не повторно выполнять ячейку) всякий раз, когда ipyflow обнаруживает входные данные и содержание ячеек, идентичные для предыдущего прогона:
По умолчанию, %%memoize Scipls All вывод, за исключением потенциального вывода DisplayHook из последнего выражения в ячейке (если применимо). Чтобы пропустить это, пропустить --quiet и включить stdout, stderr и другие богатые результаты, Pass --verbose :
Двигатель реактивного выполнения iPyflow имеет встроенную поддержку для ipywidgets , что позволяет распространять изменения виджетов по границам ячейки:
Эта функциональность может быть объединена с MAGICE %%memoize MAGINE, чтобы обеспечить почти в реальном времени рендеринг интерактивных графиков по клеткам:
Эта функциональность может быть в сочетании с другими расширениями, такими как Stickyland, чтобы построить полностью реактивные мониторные панели на вершине jupyterlab + ipyflow.
Наконец, ipyflow также интегрируется с виджетами Mercury:
Ipyflow должен понимать базовое состояние выполнения на глубоком уровне, чтобы предоставить свои функции. Он обнажает API для взаимодействия с некоторыми из этого состояния, включая функцию code для получения кода, необходимого для реконструкции некоторого символа:
# Cell 1
from ipyflow import code
# Cell 2
x = 0
# Cell 3
y = x + 1
# Cell 4
print ( code ( y ))
# Output:
"""
# Cell 2
x = 0
# Cell 3
y = x + 1
""" Вы также можете сделать это на уровне ячейки, а также с помощью метода slice() :
from ipyflow import cells
print ( cells ( 4 ). slice ())
# Output:
"""
# Cell 2
x = 0
# Cell 3
y = x + 1
# Cell 4
print(code(y))
""" Вы также можете увидеть ячейку (1-индексированную) и операцию (0-индексированного), когда символ был в последний раз обновлялся с помощью функции timestamp :
from ipyflow import timestamp
timestamp ( y )
# Timestamp(cell_num=3, stmt_num=0) Чтобы увидеть зависимости и иждивенцы определенного символа, используйте фонды deps и users соответственно:
from ipyflow import deps , users
deps ( y )
# [<x>]
users ( x )
# [<y>] Если вы хотите поднять символ для представления, используемого внутри IPYFLOW, используйте функцию lift (конечно, на ваш собственный риск):
from ipyflow import lift
y_sym = lift ( y )
y_sym . timestamp
# Timestamp(cell_num=3, stmt_num=0) Реакционная способность и другие функции фронта еще не работают в интерфейсах, таких как Colab или VSCODE, но вы все равно можете использовать API DataFlow от iPyflow на этих поверхностях, инициализация сеанса ноутбука со следующим кодом:
%pip install ipyflow
%load_ext ipyflow
Ipyflow начала свою жизнь под названием NBSafety, которое дало первоначальные предложения и функциональность нарезки.
Для предложений по исполнению:
@article { macke2021fine ,
title = { Fine-grained lineage for safer notebook interactions } ,
author = { Macke, Stephen and Gong, Hongpu and Lee, Doris Jung-Lin and Head, Andrew and Xin, Doris and Parameswaran, Aditya } ,
journal = { Proceedings of the VLDB Endowment } ,
volume = { 14 } ,
number = { 6 } ,
pages = { 1093--1101 } ,
year = { 2021 } ,
publisher = { VLDB Endowment }
} Для динамического Slicer (например, для реактивности и для функции code ):
@article { shankar2022bolt ,
title = { Bolt-on, Compact, and Rapid Program Slicing for Notebooks } ,
author = { Shankar, Shreya and Macke, Stephen and Chasins, Andrew and Head, Andrew and Parameswaran, Aditya } ,
journal = { Proceedings of the VLDB Endowment } ,
volume = { 15 } ,
number = { 13 } ,
pages = { 4038--4047 } ,
year = { 2022 } ,
publisher = { VLDB Endowment }
}Для всего, что не рассматривается в приведенных выше статьях, вы можете привести к Ipyflow Repo:
@misc { ipyflow ,
title = { {IPyflow: A Next-Generation, Dataflow-Aware IPython Kernel} } ,
howpublished = { url{https://github.com/ipyflow/ipyflow} } ,
year = { 2022 } ,
}Ipyflow не было бы возможным без удивительных академических сотрудников, перечисленных в вышеупомянутых документах. Его реактивные функции выполнения вдохновлены тем, что другие отличные инструменты, такие как Hex Notebooks, Pluto.jl и наблюдаемые. Ipyflow также пользуется перекрестным опылением идей с другими реактивными записниками Python, такими как Marimo, Jolin.io и DataLore-определенно проверьте их, если вам нравится ipyflow.
Работа над iPyflow получила выгоду от поддержки людей из ряда компаний - как в виде прямых финансовых взносов (DataBricks, Hex), а также косвенную моральную поддержку и поддержку (Ponder, Meta). И, конечно же, ipyflow опирается на фонды, созданные невероятным сообществом Юпитера.
Код в этом проекте, лицензированном по лицензии BSD-3-CLAUSE.