jupyter的精确反应性python笔记本[实验室]:
pip install ipyflowPython 3 (ipyflow) 。IPYFLOW是用于Jupyterlab和笔记本电脑7的下一代Python内核,在给定的交互式会话中跟踪符号和单元格之间的数据流关系,从而使有关笔记本状态的推理更加容易。这是Jupytercon Talk介绍它的视频(以及相应的幻灯片)。
如果您想跳过电梯音高,然后直接跳过安装 /激活说明跳到下面的快速启动;否则,请继续阅读以了解Ipyflow的理念和功能集。
iPyFlow为Jupyter的默认Python内核IPYKERNEL提供了螺栓反应性。它的设计有以下目标:
x[0] ,因此何时依赖细胞B A并且在x (例如X(例如x[1]变化时,它足够聪明,无法反应地执行单元格B结果,它将不必要的重新执行限制为最低限度。要安装,运行:
pip install ipyflow要运行IPYFlow内核,请从启动器选项卡中的可用内核列表中选择“ Python 3(IPYFLOW)”。同样,您可以通过导航到“更改内核”文件菜单项来从现有笔记本中切换到IPYFLOW:
| 入口点 | 内核切换器 |
|---|---|
IPyFlow船舶具有延长量,默认情况下为Jupyterlab和笔记本电脑7带来了反应性,类似于其他笔记本中提供的执行行为,例如可观察到的,Pluto.jl和Marimo。
但是,IPYFlow的反应性与上述行为有所不同,因为它旨在满足Jupyter用户的需求。当您使用iPyFlow执行单元格C时, C的输出,单元格的输出取决于C输出,并且依赖于C单元格的输出都会像从上到下执行笔记本(例如,通过“重新启动”和“ run-all”执行)。当您选择一些细胞C时,所有将在执行C时重新执行的单元格旁边有一个橙色点,并且C依赖于C的单元格,但它们是最新的,并且不会重新执行,并且不会重新执行紫色点:
单元格依赖性信息持续到笔记本元数据,因此您可以在开始新的内核会话后跳到任何单元格,运行它,并确信输出是笔记本电脑作者的意图:
因为为了推断依赖关系,它在运行时状态下窥视,它也需要使笔记本的内容与内核的内存状态同步,即使在浏览器刷新之间也是如此。因此,IPYFlow默认情况下可以启用自动段变更,以便内核状态,笔记本UI的内存状态和磁盘上的笔记本文件都同步。如果您不小心覆盖要保留的单元格输出,例如在反应性执行过程中,并自动覆盖磁盘上的先前结果,请不要担心! 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上也有效)仅执行所讨论的单元格:
您还可以在OPT退出默认的反应执行模式下运行魔法命令%flow mode normal (在这种情况下,CTR+Shift+Enter / CMD+Shift+Enter+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之前出现B IPYFLOW并不能阻止以前的单元格引用以后的单元格创建或更新的数据,但是在执行反应性执行时会省略这些边缘。
与任何订单语义相比,固定语义虽然较低,但具有一些理想的属性,因为它们鼓励更清洁,更可重复的笔记本电脑,以后可以更容易地将其转换为Python脚本。现在,我可能会或可能不会在订购语义上卖给您,您可以通过运行魔术命令%flow direction any_order启用iPyFlow中的任何订单语义,并使用%flow direction in_order :
如果您想使任何订单的语义都会更新IPYTHON配置文件,则可以对新内核会话进行默认行为:
c = get_config ()
c . ipyflow . flow_direction = "any_order" # defaults to "in_order"每当单元引用更新数据时,旁边的崩溃者就会得到橙色(类似于肮脏的单元的颜色),并且(递归)依赖于它的单元格被赋予紫色倒塌的颜色。 (带有紫色输出的橙色输入仅意味着输出可能是同步的。)当使用反应性执行时,您通常不会看到这些输入,因为依赖于同步的单元将自动重新运行,尽管您可能会看到它们,如果使用Ctrl+Shift+Enter inte暂时选择反应性,或者如果您选择了反应性,或者如果您更改了细胞更新的细胞(在此数据)之间(在此数据中)(在此数据之间进行过多的细胞)(在此数据中)。
如果您想让iPyflow为您修复它们,则可以在命令模式下按“空间”来自动解析所有陈旧或肮脏的单元格。此操作可能会引入更多陈旧的单元,在这种情况下,您可以继续按“空间”,直到解决所有不一致的情况下,如果需要:
引用Python功能和类的单元格,例如整数,浮点,字符串,以及Numpy阵列,Pandas DataFrames和容器(列表,DICS,集合,集合,单元等),可以使用Special %%memoize pseudomagic进行记忆。无需向单元格指定“输入”,因为IPYFLOW会自动推断出这些输入。记忆的单元将其内存的结果缓存(尽管将来计划了磁盘支持的缓存),并且每当IPYFlow检测到与先前run的输入和细胞含量相同时,都会检索这些缓存的结果(而不是重新运行单元格):
默认情况下, %%memoize跳过了所有输出,除了来自单元格中最后一个表达式的潜在示例输出(如果适用)。要跳过这一点,请通过--quiet ,并包括Stdout,stderr和其他丰富的输出,Pass --verbose :
IPyFlow的反应性执行引擎对ipywidgets具有内置支持,可以在细胞边界进行窗口小部件的更改:
该功能可以与%%memoize Magic结合使用,以提供跨单元的交互式绘制的近乎实时渲染:
该功能可以与其他扩展材料(如Stickyland)配对,以在Jupyterlab + iPyflow上构建完全反应性的仪表板。
最后,iPyFlow还与汞小部件集成在一起:
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))
"""您还可以查看timestamp最后更新的符号的单元格(1个索引)和语句(0-索引):
from ipyflow import timestamp
timestamp ( y )
# Timestamp(cell_num=3, stmt_num=0)要查看特定符号的依赖项和依赖者,请分别使用deps和users fuctions:
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等接口中使用,但是您仍然可以通过以下代码初始化笔记本电脑会话来使用IPYFlow的DataFlow API:
%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 }
}对于动态切片机(例如,用于反应性和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回购:
@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,也一定会检查它们。
IPYFLOF的工作受益于许多公司的支持,包括直接财务贡献(Databricks,HEX)以及间接的道德支持和鼓励(Ponder,Meta)的形式。当然,iPyflow依靠令人难以置信的jupyter社区建立的基础。
该项目中的代码在BSD-3-CAREASE许可证下许可。