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許可證下許可。