潇大

Feb 13, 2023

2023-02-13 回顾:将 Streamlit 作为 Jupyter 的替代尝试

在之前的一篇文章中,提到了 Streamlit 这个可以帮你快速构建数据可视化的 web app 框架。
 
在深入研究和体验后,我发现其特色之一,便是开发工作流
💡
Streamlit 会自动检测你的源代码修改,并且询问你是否需要自动重新运行。这样,在开发前端应用的过程中,本地修改代码,更新部署服务,再测试的过程,就可以变得更高效快速。如果将 Editor 和浏览器并排显示,那么即时的代码修改就能立即生效。
 
而 Python 中另一个能产生即时交互体验的工具,便是 Jupyter 了。
💡
Jupyter 是一种由社区支持和维护的开源交互式计算环境。它旨在提供一个功能强大且易于使用的可视化界面,可帮助开发人员运行图形化的计算任务,并为数据科学提供强大的可视化工具。Jupyter 可以让开发者使用不同的编程语言,包括 Python、R、Julia 和 Scala,建立和共享可视化的代码结果。Jupyter 也可以作为一个 web 应用程序,允许多个用户连接并共享相同的代码环境,从而更方便地进行协同开发。
 
尽管 Jupyter 拥有很强大的功能,但我在具体用的过程中,还是有些不方便的地方,列举如下:
  1. 适用于小规模的分析或者预处理,但其作为一个单独的 .ipynb 文件,很难与一个 python 项目融合放到一起管理,并且文件中会包含输出,也不适合用于版本管理中。
  1. 定义预处理函数,会占用较长的篇幅,尤其是当预处理计算函数较多的时候,需要反复翻页。有一种办法是将函数定义到文件中,但若函数有修改,就需要重启内核来加载。
  1. 交互性的缺失。在一些分析性的场景,需要观察某个输入在不同的情况下,会对应产生什么样的效果,就需要写一些 meaningless for 循环,或者是不停修改参数,重新执行。针对这一点,我倒是很喜欢在 Mathematica 中的 Manipulate 函数,用一种优雅的 语法 来实现交互。
  1. 共享代码环境,仅针对开发者而言。当需要共享的只是是结论性内容(不需要代码片段),功能就比较受限。比如我想通过特定的 url 访问包含特定参数的资源,这些场景 Jupyter 就做不到。
 
这就萌生了用 Streamlit 平行替代 Jupyter 的想法,它有如下的一些优势:
  1. 本身也是单独的 .py 文件,通过良好的模块设计,可以与现有的 Python 项目融合,放到版本管理体系中。
  1. 预处理函数可以作为函数或模块隐藏在代码中,不会占用 UI 显示资源,可以精细控制要展示的数据和组件。
  1. 即时开发工作流,使得修改了函数定义后,也能够自动刷新来获取最新的计算结果,而不必重启内核。
  1. 用很少量的代码来交互效果,可以实现诸如按钮、滑动条等组件,点击后就会触发对应的事件。
 
顺便在这里介绍一下 Streamlit 的设计思想,分为四步走:
  1. 完全兼容类似 Python 的语法,可以直接运行,将输出渲染到网页上
  1. 一行代码写组件:即所有的控件、布局,都可以
 
等有一些具体案例的时候,再补充相关的细节。
交互创建图表。参考 Manipulate 的相关函数设计。
 
 
def fib(n: int) -> int: if n == 0: return 0 elif n == 1: return 1 else: return fib(n-1) + fib(n-2) print(fib(30))
第30项斐波那契数列的值为 832040。

Copyright © 2025 潇大

logo