Notebooks de Python reactivos precisos para Jupyter [Lab]:
pip install ipyflowPython 3 (ipyflow) del lanzador o selector de kernel.Ipyflow es un núcleo de Python de próxima generación para Jupyterlab y el cuaderno 7 que rastrea las relaciones de flujo de datos entre símbolos y celdas durante una sesión interactiva dada, lo que facilita la razón del estado de cuaderno. Aquí hay un video de la charla de Jupytercon que lo presenta (y las diapositivas correspondientes).
Si desea omitir el tono del elevador y omitir directamente a las instrucciones de instalación / activación, salte a arranque rápido a continuación; De lo contrario, siga leyendo para aprender sobre la filosofía y el conjunto de características de Ipyflow.
Ipyflow proporciona reactividad Bolt-On al núcleo Python predeterminado de Jupyter, Ipykernel. Fue diseñado con los siguientes objetivos en mente:
B depende de la celda A debido a una referencia de subíndice x[0] , y es lo suficientemente inteligente como para no ejecutar reactivamente la celda B cuando otra parte de x , por ejemplo, x[1] cambia. Como resultado, limita la re-ejecución innecesaria a un mínimo.Para instalar, ejecute:
pip install ipyflowPara ejecutar un kernel iPyflow, seleccione "Python 3 (Ipyflow)" de la lista de núcleos disponibles en la pestaña Lanzador. Del mismo modo, puede cambiar a / desde ipyflow desde un cuaderno existente navegando al elemento del menú del archivo "Cambiar kernel":
| Punto de entrada | Conmutador de núcleo |
|---|---|
Ipyflow se envía con extensiones que traen reactividad a Jupyterlab y el cuaderno 7 de forma predeterminada, similar al comportamiento de ejecución ofrecido en otros cuadernos como observable, plutón.jl y marimo.
Sin embargo, la reactividad de Ipyflow se comporta de manera un poco diferente de lo anterior, ya que fue diseñado para satisfacer las necesidades de los usuarios de Jupyter en particular. Cuando ejecuta la celda C con IpyFlow, la salida de C , la salida de las celdas C depende y la salida de las celdas que dependen de C aparecen como lo harían si el cuaderno se ejecutara de arriba a abajo (por ejemplo, a través de "reiniciar y ejecutar todo"). Cuando selecciona algunas celdas C , todas las celdas que volverían a ejecutar cuando C se ejecuta C tiene un punto naranja al lado de ellas, y las células de las que C dependen pero que están actualizadas y no volverán a ejecutar los puntos morados:
La información de dependencia de la celda persiste en los metadatos del cuaderno, para que pueda saltar a cualquier celda después de comenzar una nueva sesión de núcleo, ejecutarla y estar seguro de que la salida es lo que pretendía el autor del cuaderno:
Debido a que Ipyflow se asoma en el estado de tiempo de ejecución para inferir dependencias, necesita mantener el contenido del cuaderno sincronizado con el estado de memoria del núcleo, incluso en las actualizaciones del navegador. Como tal, iPyflow habilita el auto-cambio de autosave de forma predeterminada, de modo que el estado del núcleo, el estado de la interfaz de usuario del cuaderno y el archivo del cuaderno en el disco están sincronizados. Si accidentalmente sobrescribe la producción de una celda que quería mantener, por ejemplo, durante una ejecución reactiva, y el autosavible sobrescribe el resultado anterior en el disco, ¡no temas! Ipyflow proporciona una utilidad de la biblioteca llamada reproduce_cell para recuperar la entrada y salida de ejecuciones de celdas anteriores (dentro de una sesión de kernel dada):
from ipyflow import reproduce_cell
reproduce_cell ( 4 , lookback = 1 ) # to reproduce the previous execution of cell 4Ejemplo:
Si desea optar temporalmente por fuera de la ejecución reactiva, puede usar Ctrl+Shift+Enter (en Mac, CMD+Shift+Enter también funciona) para ejecutar solo la celda en cuestión:
También puede ejecutar el %flow mode normal en OPP OPT del modo de ejecución reactiva predeterminada (en cuyo caso, Ctr+Shift+Enter / CMD+Shift+Enter cambiará de no ser reactivo a reactivo). Para volver a la ejecución reactiva como predeterminada, puede ejecutar %flow mode reactive :
Si desea evitar el comportamiento reactivo predeterminado para cada nueva sesión de kernel, puede agregar esto a su perfil de iPython (ubicación predeterminada típicamente en ~/.ipython/profile_default/ipython_config.py )::
c = get_config ()
c . ipyflow . exec_mode = "normal" # defaults to "reactive" Ipyflow predeterminado es semántica en orden , lo que significa que, si la celda B depende de la celda A , entonces A debe aparecer antes B en el orden espacial del cuaderno. Ipyflow no evita que las celdas anteriores hagan referencia a datos creados o actualizados por celdas posteriores, pero omite estos bordes al realizar una ejecución reactiva.
La semántica en orden, aunque menos flexible, tiene algunas propiedades deseables en comparación con la semántica de cualquier orden, ya que fomentan los cuadernos más limpios y reproducibles que pueden convertirse más fácilmente en scripts de Python más adelante. Ahora que puedo o no haberlo vendido en semántica a pedido, puede habilitar cualquier semántica de orden en Ipyflow ejecutando la %flow direction any_order , y recupere la semántica predeterminada en orden usando %flow direction in_order :
También puede actualizar su perfil de iPython si desea hacer de cualquier semántica de orden el comportamiento predeterminado para nuevas sesiones de kernel:
c = get_config ()
c . ipyflow . flow_direction = "any_order" # defaults to "in_order"Cada vez que una celda hace referencia a los datos actualizados, el colapsador al lado tiene un color naranja (similar al color de las células sucias), y las células que (recursivamente) dependen de él se les da un color de colapsro púrpura. (Una entrada naranja con una salida púrpura solo significa que la salida puede estar fuera de sincronización). Cuando se usa la ejecución reactiva, generalmente no lo verá, ya que las celdas dependientes fuera de sincronización se volverán automáticamente, aunque puede verlos si usa CTRL+Shift+ingresar para optar temporalmente por la reactividad, o si cambia qué datos se actualizan las actualizaciones (sobre los edificios anteriores entre las células).
Si desea dejar que Ipyflow lo arregle para usted, puede presionar "espacio" cuando está en modo de comando para resolver automáticamente todas las celdas rancias o sucias. Esta operación puede introducir celdas más obsoletas, en cuyo caso puede continuar presionando "espacio" hasta que se resuelvan todas las inconsistencias, si lo desea:
Las células que hacen referencia a las funciones y clases de Python, primitivas como enteros, carrozas, cuerdas, así como matrices numpy, pandas dataframes y contenedores (listas, dicts, conjuntos, tuplas, etc.) se pueden no memorizar mediante Ipyflow utilizando el %%memoize pseudomagic. No es necesario especificar las "entradas" a la celda, ya que Ipyflow los inferirá automáticamente. Las células memoizadas almacenan en caché sus resultados en memoria (aunque se planifican cachés respaldados por disco para el futuro), y recuperarán estos resultados en caché (en lugar de volver a manejar la celda) siempre que Ipyflow detecta entradas y contenido de celdas idéntico al de una ejecución anterior:
Por defecto, %%memoize omite toda la salida, excepto la salida potencial de visualización de la última expresión en la celda (cuando corresponda). Para omitir esto también, pase --quiet , e incluir a Stdout, Stderr y otros ricos, pase --verbose :
El motor de ejecución reactiva de Ipyflow tiene soporte incorporado para ipywidgets , lo que permite que los cambios en los widgets se propagen a través de los límites de la celda:
Esta funcionalidad se puede combinar con la magia %%memoize para proporcionar una representación casi en tiempo real de las gráficas interactivas en las celdas:
Esta funcionalidad se puede combinar con otras extensiones como Stickyland para construir paneles totalmente reactivos sobre JupyterLab + Ipyflow.
Finalmente, Ipyflow también se integra con widgets de mercurio también:
Ipyflow debe comprender el estado de ejecución subyacente en un nivel profundo para proporcionar sus características. Expone una API para interactuar con algunos de este estado, incluida una función code para obtener el código necesario para reconstruir algún símbolo:
# 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
""" También puede hacerlo a nivel celular también utilizando el método slice() :
from ipyflow import cells
print ( cells ( 4 ). slice ())
# Output:
"""
# Cell 2
x = 0
# Cell 3
y = x + 1
# Cell 4
print(code(y))
""" También puede ver la celda (1 indexada) y la declaración (0-indexada) de cuando un símbolo se actualizó por última vez con la función de timestamp :
from ipyflow import timestamp
timestamp ( y )
# Timestamp(cell_num=3, stmt_num=0) Para ver dependencias y dependientes de un símbolo particular, use las fuctions deps y users , respectivamente:
from ipyflow import deps , users
deps ( y )
# [<x>]
users ( x )
# [<y>] Si desea elevar un símbolo a la representación utilizada internamente por Ipyflow, use la función lift (bajo su propio riesgo, por supuesto):
from ipyflow import lift
y_sym = lift ( y )
y_sym . timestamp
# Timestamp(cell_num=3, stmt_num=0) La reactividad y otras características frontend aún no funcionan en interfaces como Colab o VScode, pero aún puede usar la API DataFlow de Ipyflow en estas superficies inicializando su sesión de cuaderno con el siguiente código:
%pip install ipyflow
%load_ext ipyflow
Ipyflow comenzó su vida bajo el nombre Nbsafety, que proporcionó las sugerencias iniciales y la funcionalidad de corte.
Para las sugerencias de ejecución:
@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 }
} Para el cortador dinámico (utilizado para la reactividad y para la función code , por ejemplo):
@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 }
}Para cualquier cosa que no esté cubierta en los documentos anteriores, puede citar el repositorio de iPyflow:
@misc { ipyflow ,
title = { {IPyflow: A Next-Generation, Dataflow-Aware IPython Kernel} } ,
howpublished = { url{https://github.com/ipyflow/ipyflow} } ,
year = { 2022 } ,
}Ipyflow no hubiera sido posible sin los increíbles colaboradores académicos que figuran en los documentos anteriores. Sus características de ejecución reactiva se inspiran en las de otras herramientas excelentes como cuadernos hexadeciminos, plutón.jl y observables. Ipyflow también disfruta de la polinización cruzada de ideas con otros cuadernos reactivos de Python como Marimo, Jolin.io y Dataalore, definitivamente consulte también si le gusta Ipyflow.
El trabajo en Ipyflow se ha beneficiado del apoyo de la gente de varias empresas, tanto en forma de contribuciones financieras directas (Databricks, HEX) como de apoyo moral indirecto y aliento (Ponder, Meta). Y, por supuesto, Ipyflow se basa en las bases construidas por la increíble comunidad de Jupyter.
Código en este proyecto con licencia bajo la licencia de cláusula BSD-3.