Violit: Streamlit杀手,无需全局刷新,构建AI面板

"速度超越光速,美如Violit。" Streamlit 的结构 × React 的性能

Violit 是一个新一代 Python Web 框架,它采用 O(1) 状态架构 以实现即时响应,这与 Streamlit 的完全脚本重运行结构不同。

构建响应速度如光速、语法最优雅的应用程序。

为什么是Violit?

架构差异

Violit 和 Streamlit 的相似之处在于它们都使用 Python 代码构建用户界面,但它们的内部机制从根本上来说是不同的。

特征 Streamlit(传统) Violit(响应式)
执行模型 完全重运行 (O(N)),每次用户交互时重新运行整个脚本。 零重新运行 (O(1)),仅更新与已修改状态相连的组件。
表现 随着数据量的增加,响应速度可能会降低。 无论数据规模如何,都能保持一致的反应速度。
优化 需要像 @cache 、 @fragment 这样的优化装饰器。 设计上已进行优化,无需额外的优化代码。
部署 针对网页浏览器执行进行了优化。 同时支持网页浏览器模式和桌面原生应用模式。
设计 专注于提供基本用户界面。 提供 30 多个专业主题的即用型设计。

主要特点

  1. 通过设计进行优化(类似 Streamlit 的语法,无复杂性) :保留了 Streamlit 直观的语法,但在架构层面上移除了复杂的优化工具。

    • 无需 @cache_data@fragmentst.rerun :由于 O(1) 结构,无需手动优化。
    • 无需 key 管理 :无需手动指定小部件状态管理的唯一键。
    • 无需复杂的回调函数 :无需像 Dash 或 Panel 那样定义复杂的回调函数/类。
  2. 超快速度 :即使以 0.1 秒的增量移动滑块,图表也能实时反应,不会出现卡顿。

  3. 混合运行时

    • WebSocket 模式 :超低延迟双向通信(默认)
    • 精简模式 :基于 HTTP,有利于处理大规模并发连接
  4. 桌面模式 :无需 Electron 即可使用 --native 选项作为完美的桌面应用程序运行。

主题画廊

你完全不需要懂 CSS。Violit 提供了超过 30 个主题。(不久之后,用户将能够轻松添加自定义主题。)

python 复制代码
# Configuration at initialization
app = vl.App(theme='cyberpunk')

# Runtime change
app.set_theme('ocean')
主题家族 示例
黑暗 dark 、 dracula 、 monokai 、 ocean 、 forest 、 sunset
阳光 light 、 pastel 、 retro 、 nord 、 soft_neu
科技 cyberpunk 、 terminal 、 cyber_hud 、 blueprint
专业 editorial 、 bootstrap 、 ant 、 material 、 lg_innotek

基准测试与性能

基准测试结果表明,Violit 的 O(1) 更新方法与现有的 O(N) 方法相比效率更高。

对比

Python UI 框架

Framework Architecture Learning Curve Performance Desktop App Real-time
Streamlit Full Rerun Very Easy Slow
Dash Callback Medium Fast
Panel Param Hard Fast
Reflex React (Compile) Hard Fast
NiceGUI Vue Easy Fast
Violit Signal Very Easy Fast

代码比较

1. 与 Streamlit 对比 (Rerun 与 Signal)

Streamlit 在按钮点击时会重新执行整个脚本 ,但 Violit 只会执行该函数

python 复制代码
# Streamlit
import streamlit as st

if "count" not in st.session_state:
    st.session_state.count = 0

if st.button("Click"):
    st.session_state.count += 1 # Rerun triggers here

st.write(st.session_state.count)
python 复制代码
# Violit
import violit as vl
app = vl.App()

count = app.state(0)

# Update only count on click (No Rerun)
app.button("Click", on_click=lambda: count.set(count.value + 1))
app.write(count) 

2. vs Dash (回调地狱 vs 自动响应)

Dash 需要复杂的回调函数 来连接输入/输出,但 Violit 只需要一个状态

python 复制代码
# Dash
from dash import Dash, html, Input, Output, callback

app = Dash(__name__)
app.layout = html.Div([
    html.Button("Click", id="btn"),
    html.Div(id="out")
])

@callback(Output("out", "children"), Input("btn", "n_clicks"))
def update(n):
    return f"Value: {n}" if n else "Value: 0"
python 复制代码
# Violit
count = app.state(0)

app.button("Click", on_click=lambda: count.set(count.value + 1))
# Automatic state dependency tracking -> No Callback needed
app.write(lambda: f"Value: {count.value}")

3. 与 NiceGUI 的比较 (绑定 vs 直接状态)

NiceGUI 也很棒,但 Violit 提供了类似 Streamlit 的更简洁的语法

python 复制代码
# NiceGUI
from nicegui import ui

count = {'val': 0}
ui.button('Click', on_click=lambda: count.update(val=count['val'] + 1))
ui.label().bind_text_from(count, 'val', backward=lambda x: f'Value: {x}')
python 复制代码
# Violit
count = app.state(0)
app.button('Click', on_click=lambda: count.set(count.value + 1))
app.write(count) # No need for complex connections like .bind_text

4. 与 Reflex 的对比 (类编译 vs 纯 Python)

Reflex 需要定义编译 State 类,但 Violit 是一个纯 Python 脚本。

python 复制代码
# Reflex
import reflex as rx

class State(rx.State):
    count: int = 0
    def increment(self):
        self.count += 1

def index():
    return rx.vstack(
        rx.button("Click", on_click=State.increment),
        rx.text(State.count)
    )
python 复制代码
# Violit
# No class definition needed, no compilation needed
count = app.state(0)
app.button("Click", on_click=lambda: count.set(count.value + 1))
app.write(count)

快速入门

1. 安装

可安装在 Python 3.10+ 环境中。

bash 复制代码
pip install violit

# Or development version
pip install git+https://github.com/violit-dev/violit.git

2. 你好,Violit!

创建一个名为 hello.py 文件。

python 复制代码
import violit as vl

app = vl.App(title="Hello Violit", theme='ocean')

app.title("Hello, Violit!")
app.markdown("Experience the speed of **Zero Rerun**.")

count = app.state(0)

col1, col2 = app.columns(2)
with col1:
    app.button("➕ Plus", on_click=lambda: count.set(count.value + 1))
with col2:
    app.button("➖ Minus", on_click=lambda: count.set(count.value - 1))

app.metric("Current Count", count)

app.run()

3. 执行

bash 复制代码
# Basic run (WebSocket Mode)
python hello.py

# Desktop App Mode (Recommended)
python hello.py --native

# Port configuration
python hello.py --port 8020

小部件支持

Violit 支持 Streamlit 核心组件,并且一些功能经过重新设计,效率更高。

有关详细的兼容性列表和不支持的小部件信息,请参阅 Streamlit API 支持矩阵文档。

技术栈

  • 后端 :FastAPI(异步 Python)
  • 前端 :Web Components(Shoelace)、Plotly.js、AG-Grid
  • 协议 :WebSocket 和 HTTP/HTMX 混合协议
  • 状态 :基于信号的反应式

路线图

Violit是不断演变的。

  • 核心 :信号状态引擎、主题系统
  • 小部件 :Plotly、数据框、输入小部件
  • 主页 :官方主页可打开
  • 文档 :官方技术文档和 API 参考更新
  • 自定义组件 :用户自定义组件支持
  • 自定义主题 :支持用户自定义主题
  • async :支持异步处理
  • 更多示例 :提供更多实际可用的示例代码
  • Violit.Cloud :云部署服务
  • 扩展 :集成更多第三方库

📂 项目结构

bash 复制代码
.
├── violit/            # Framework source code
│   ├── app.py         # Main App class and entry point
│   ├── broadcast.py   # Real-time WebSocket broadcasting
│   ├── state.py       # Reactive State Engine
│   ├── theme.py       # Theme management
│   ├── assets/        # Built-in static files
│   └── widgets/       # Widget implementations
│       ├── input_widgets.py
│       ├── data_widgets.py
│       ├── layout_widgets.py
│       └── ...
└── requirements.txt   # Dependency list

https://github.com/violit-dev/violit

Violit: Streamlit杀手,无需全局刷新,O(1)速度

相关推荐
星爷AG I2 小时前
9-14 知觉整合(AGI基础理论)
人工智能·agi
递归尽头是星辰2 小时前
大模型与向量检索的融合:从核心原理到 Spring AI 落地
人工智能·大模型·向量检索·rag·spring ai·向量库
gihigo19982 小时前
希尔伯特-黄变换(HHT)完整MATLAB实现
人工智能·算法·matlab
我什么都学不会2 小时前
Python练习作业2
开发语言·python
min1811234562 小时前
AI金融风控:智能反欺诈与个性化理财
大数据·人工智能
2013092416272 小时前
1982年霍普菲尔德网络奠基之作:深度导读与全景解析报告
人工智能
wanghao6664552 小时前
机器学习三大流派:监督、无监督与强化学习
人工智能·机器学习
爱喝可乐的老王2 小时前
神经网络的基础:核心是 “搭积木 + 激活信号”
人工智能·深度学习·神经网络
b2077212 小时前
Flutter for OpenHarmony 身体健康状况记录App实战 - 健康目标实现
python·flutter·harmonyos