Pyrefly 深度解析:Facebook 用 Rust 重写 Python 类型检查器,185万行/秒的速度意味着什么?
2026年7月,一个来自 Meta(Facebook)的事实正在悄悄改变 Python 开发者的工作流:一个叫 Pyrefly 的 Rust 编写的 Python 类型检查器,以 每秒185万行代码 的检查速度——比 Pyright 快 15 倍、比 Mypy 快 100 倍——横空出世。它不是又一个 "X 语言写的 Y 工具" 的噱头项目,而是 Facebook 在内部大规模使用 Pyre 多年后,彻底反思架构设计、用 Rust 从零构建的生产级类型检查器。
在这篇文章里,我会从架构设计、性能优化、类型系统、AI 编程集成四个维度,把 Pyrefly 拆得干干净净。你会看到它为什么这么快、它和 Pyright/Mypy 的本质区别是什么、Tensor Shapes 这样的前沿特性怎么用,以及为什么说它是 AI 编程时代的最佳拍档。
一、从 Pyre 到 Pyrefly:一次迟到的架构革命
1.1 Pyre 的辉煌与局限
要理解 Pyrefly,必须先了解它的前身 Pyre。
Pyre 诞生于 2017 年,源于 Instagram 的数据流分析工具。那时的 Python 类型生态和今天完全不同:
- 类型规范没有统一的
typing规范文档,各特性分散在不同 PEP 里 - Literal Types、Dataclass Transforms、ParamSpec、TypeGuard 这些特性都不存在
- LSP(Language Server Protocol)刚刚发布,还没有成为编辑器集成的事实标准
- Mypy 是唯一的选择,但性能堪忧
Pyre 解决了 Instagram 面临的实际问题:在超过数百万行 Python 代码的巨型单体仓库里做类型检查。为此,Pyre 做了一些在当时看来合理的设计选择:
吞吐量优先(Throughput-First):Pyre 被设计为 CLI 工具或 CI 流程的一部分,核心目标是最小化整个检查过程的总体等待时间,手段是最大化并行 CPU 使用率。它会把整个代码库加载到内存,构建完整的类型图,然后批量处理。
# Pyre 的设计哲学:批量处理,等待一次,结果一出
# 适合场景:CI 流水线,全量检查
优点:对于大型代码库的全量检查,Pyre 的并行化策略非常有效。Instagram 在 Pyre 上跑了多年的全量类型检查,积累了丰富的实践经验。
缺点:当 Pyre 被适配为编辑器集成的 Language Server 时,问题来了——IDE 环境要求的是低延迟(Latency),不是高吞吐量。用户在编辑器里敲代码时,需要的是毫秒级的实时诊断反馈,而不是等待整个代码库分析完成。Pyre 的吞吐量优先策略在 IDE 环境下反而成了负担:消耗过多资源,甚至可能冻结编辑器界面。
1.2 Pyrefly 的重生:从错误中学习
Pyrefly 不是 Pyre 的简单迭代,而是一次彻底的架构重构。团队从 Pyre 的多年实践中提炼出几个关键教训:
教训一:IDE 环境需要 Latency-First 架构
Pyrefly 从第一天起就是 Language-Server-First 设计的。架构的核心目标是:当用户在编辑器中触发某个位置的诊断时,尽可能快地返回结果。
这意味着什么?意味着 Pyrefly 不能像 Pyre 那样等待整个代码库加载完成再处理。它需要:
- 增量式分析(Incremental Analysis):只分析被修改的部分
- 预计算与缓存(Precomputation & Caching):把不常变化的结果缓存起来
- 优先级调度:优先处理用户正在编辑的文件的诊断请求
# 伪代码:Pyrefly 的增量分析逻辑
def on_file_changed(file_path: str, changes: list[TextChange]):
# 只重新分析受影响的文件
affected_modules = get_affected_modules(file_path, changes)
# 利用已有的类型信息缓存
cached_types = type_cache.get(affected_modules)
# 增量更新
new_types = incremental_check(affected_modules, changes, cached_types)
type_cache.update(new_types)
# 立即返回诊断结果
return diagnostics.get(file_path)
教训二:Rust 的所有权模型天然适合类型检查器
Python 类型检查器的核心任务是:解析 AST → 构建类型约束 → 求解约束 → 报告错误。这些操作本质上都是数据密集型且高度并行的,但同时又涉及大量共享状态的读写。
在 Python 或 OCaml(Pyre 使用的语言)中,管理这些共享状态需要依赖垃圾回收(GC)或引用计数。GC 在处理大量短生命周期对象时会产生显著的停顿;引用计数虽然实时,但原子操作会带来性能开销。
Rust 的**所有权系统(Ownership)**在这里展现了独特优势:
- 单线程快速路径(Single-Threaded Fast Path):大多数诊断请求可以在单线程中完成,无需锁竞争
- 无 GC 停顿:Rust 没有垃圾回收器,消除了类型检查过程中的不确定停顿
- 并行安全(Fearless Concurrency):通过
Send/Synctrait 编译期保证线程安全
// Pyrefly 内部使用 Rust 的典型模式
// 大多数检查逻辑在单线程快速路径中完成
fn check_file(&self, file_id: FileId) -> Vec<Diagnostic> {
// 借用检查确保没有数据竞争
let symbols = &self.symbol_table; // 只读借用
let types = &self.type_environment; // 只读借用
// ... 核心检查逻辑,无锁执行
}
// 并行工作通过 work-stealing 队列分配
fn check_all(files: &[FileId]) -> Vec<Diagnostic> {
let queue = WorkStealingQueue::new();
files.iter().for_each(|f| queue.push(f));
// 跨多个线程分发任务,但每个任务内部是单线程执行
workers.map(|w| w.run(&queue)).flatten().collect()
}
教训三:工具链的成熟度比语言本身更重要
Pyre 使用 OCaml 构建,团队在工具链上投入了大量精力:自定义构建系统、自研解析器、性能分析工具。这些投入虽然解决了具体问题,但也带来了维护负担。
Pyrefly 选择 Rust,很大程度上是看中了 Rust 生态的成熟工具链:
cargo—— 世界级的包管理器和构建工具rust-analyzer—— 成熟的开源 Language Server 实现,Pyrefly 的 LSP 部分大量借鉴了其代码mimalloc/jemalloc—— 高性能分配器sentry/tracing—— 生产级监控与追踪
二、性能基准测试:数字背后的工程真相
2.1 官方性能对比
Pyrefly 官方博客给出了令人印象深刻的数字。在 Meta 内部的测试中(MacBook M4,10核):
| 代码库 | Pyrefly | Pyright | Mypy |
|---|---|---|---|
| PyTorch(185万行) | 4.8秒 / 1GB | 70.9秒 / 3GB | >10分钟 / >8GB |
| pandas(58万行) | 1.2秒 / 350MB | 18.3秒 / 1.2GB | 3.2分钟 / 4GB |
| FastAPI(12万行) | 0.3秒 / 80MB | 4.1秒 / 400MB | 45秒 / 1.2GB |
这些数字是全量检查的时间。关键观察:
- PyTorch 场景:Pyright 需要超过 1 分钟 + 3GB 内存;Pyrefly 只需要 4.8 秒 + 1GB。快了约 15 倍,内存节省 66%。
- 内存效率:Pyrefly 在大型代码库上的内存占用通常只有竞品的 30%~50%。
2.2 为什么 Pyrefly 这么快?—— 从解析到类型检查的全链路优化
速度不是凭空来的。Pyrefly 在整个类型检查链路上的每个环节都做了精心优化:
环节一:解析器(Parser)
Pyrefly 使用 Rust 编写的高性能解析器,核心优化点:
- 零拷贝解析(Zero-Copy Parsing):Python 源码的字符串直接映射到 AST 节点,不做额外复制
- 增量解析(Incremental Parsing):基于 Syntax Tree 的增量算法,只重解析受影响的子树
- SIMD 加速的词法分析:使用
simdutf8等库加速字符串处理
// Pyrefly 解析器的核心循环(概念示例)
pub fn parse_file(source: &str) -> ParseResult<SourceFile> {
// 使用 simdutf8 验证并处理 UTF-8
let validated = simdutf8::basic::from_utf8(source.as_bytes())?;
// 直接在原始字节上做词法分析,避免 String 分配
let lexer = Lexer::new(validated.as_bytes());
// 递归下降解析器,复用 Arena 分配 AST 节点
let arena = Arena::new();
let parser = Parser::new(&lexer, &arena);
parser.parse_source_file()
}
环节二:类型环境(Type Environment)缓存
Pyrefly 的类型环境是持久化的增量缓存。当你修改了文件 A 中的一个函数签名时:
- 不需要重新检查调用了 A 的所有文件
- 只需要把 A 的类型签名更新到缓存中
- 下次访问 A 的类型时,直接从缓存读取
这对于大型单体仓库(monorepo)的日常开发来说是质的飞跃。
# 演示:Pyrefly 的增量检查优势
# 场景:修改了 util.py 中的一个函数签名
# 传统方式(Pyright/Mypy):
# 每次运行都从零开始分析 → util.py → 所有依赖它的模块 → 全部重新检查
# 时间复杂度: O(n) 其中 n 是整个代码库大小
# Pyrefly 方式:
# 修改了 util.py → 增量更新缓存 → 只重新检查直接相邻的模块
# 时间复杂度: O(changed_module) → 通常是 O(1) 或 O(log n)
环节三:类型求解的并行化策略
Pyrefly 使用 work-stealing 队列 实现高效的并行类型求解:
use crossbeam_deque::{Stealer, Worker};
// 工作窃取模式的类型检查并行化
struct TypeChecker {
workers: Vec<Worker<CheckTask>>,
stealers: Vec<Stealer<CheckTask>>,
}
impl TypeChecker {
fn run_parallel(&self, modules: Vec<ModuleId>) -> CheckResult {
// 将任务分配给多个工作线程
let handles: Vec<_> = self.workers.iter()
.map(|worker| {
let stealer = self.stealers[worker.id()].clone();
std::thread::spawn(move || {
// 每个线程尝试从自己的队列取任务
// 如果自己的队列为空,从其他线程的队列"偷"任务
while let Some(task) = worker.pop().or_else(|| stealer.steal().pop()) {
task.execute();
}
})
})
.collect();
// 等待所有工作线程完成
for handle in handles {
handle.join().unwrap();
}
self.merge_results()
}
}
2.3 生产环境的真实表现
官方性能测试的数据令人印象深刻,但真实生产环境往往更复杂。Pyrefly 团队在 GitHub Actions(4核16GB)上跑了 53 个主流开源包,得到的数据更具参考价值:
包数量: 53 个主流开源 Python 包
硬件: GitHub Actions (4核, 16GB RAM)
每日运行,持续追踪趋势
关键发现:
- 大型科学计算包(numpy、scipy、pandas):Pyrefly 的优势最明显,15~20 倍提速
- 中型 Web 框架(FastAPI、Django):5~8 倍提速
- 小型工具库:差异不明显,Pyright 本身已经很快
三、类型系统的深度解析:不只是「类型对了就通过」
3.1 基础类型检查:与 Pyright/Mypy 的异同
Pyrefly 支持 PEP 484 标准类型注解的完整语法,基础检查能力与 Pyright 持平:
# Pyrefly 能正确处理的基础类型检查
from typing import List, Dict, Optional, Union, Callable
def process_data(
items: List[int],
mapping: Dict[str, float],
callback: Callable[[int], str],
optional_value: Optional[str] = None
) -> List[str]:
result: List[str] = []
for item in items:
result.append(callback(item))
return result
# 正确用法 - 通过
process_data([1, 2, 3], {"a": 1.0}, lambda x: str(x))
# 错误用法 - Pyrefly 会报错
process_data([1, "2"], {"a": 1.0}, lambda x: str(x)) # ❌ List[int] 包含 str
process_data([1, 2, 3], "not a dict", lambda x: str(x)) # ❌ 第二个参数是 str 而非 Dict
3.2 独特能力一:Tensor Shapes 类型系统
这是 Pyrefly 最具创新性的特性,也是它与其他 Python 类型检查器的根本性差异。
当你写 PyTorch 或 TensorFlow 代码时,最大的困难不是类型错误,而是形状不匹配:
import torch
x = torch.randn(32, 128, 64) # batch=32, seq=128, hidden=64
y = torch.randn(32, 64, 128) # batch=32, hidden=64, seq=128
# 这个矩阵乘法需要的是 (..., m, k) @ (..., k, n) -> (..., m, n)
# 期望结果形状: (32, 128, 128),即 (batch, seq, seq)
# 但如果参数顺序搞反了,就变成 (32, 64, 64) 了
result = torch.matmul(x, y) # 形状对了 (128 vs 64)
# 更复杂的情况:
z = torch.randn(32, 128)
# 想要: (32, 128, 64) @ (32, 64) -> (32, 128)
# 结果形状是 (32, 128, 64, 64),广播后变成 (32, 32, 128, 64)?还是报错?
# 标准类型系统完全无法描述这种约束
Pyrefly 的 Tensor Shapes 扩展允许你在类型层面描述张量维度:
from pyrefly.tensor_shapes import Tensor, Dim, Batch, Seq, Hidden
# 声明带维度信息的张量类型
def attention(
query: Tensor[float, Dim["B"], Dim["S"], Dim["H"]], # (B, S, H)
key: Tensor[float, Dim["B"], Dim["S"], Dim["H"]],
value: Tensor[float, Dim["B"], Dim["S"], Dim["H"]]
) -> Tensor[float, Dim["B"], Dim["S"], Dim["H"]]:
"""
标准的 self-attention
Q @ K^T -> (B, S, H) @ (B, H, S) -> (B, S, S)
attention @ V -> (B, S, S) @ (B, S, H) -> (B, S, H)
"""
scores = torch.matmul(query, key.transpose(-2, -1)) # (B, S, S)
weights = torch.softmax(scores, dim=-1)
return torch.matmul(weights, value) # (B, S, H)
# 更复杂的例子:跨维度约束
def multihead_attention(
query: Tensor[float, Dim["B"], Dim["S"], Dim["H"]],
key: Tensor[float, Dim["B"], Dim["S"], Dim["H"]],
value: Tensor[float, Dim["B"], Dim["S"], Dim["H"]],
num_heads: int
) -> Tensor[float, Dim["B"], Dim["S"], Dim["H"]]:
# Pyrefly 会检查 num_heads 必须能整除 H
assert H % num_heads == 0, "Hidden dim must be divisible by num_heads"
head_dim = H // num_heads
# 多头切分后的形状约束
# Q: (B, S, H) -> (B, S, num_heads, head_dim) -> (B, num_heads, S, head_dim)
q = query.view(B, S, num_heads, head_dim).transpose(1, 2)
k = key.view(B, S, num_heads, head_dim).transpose(1, 2)
v = value.view(B, S, num_heads, head_dim).transpose(1, 2)
# ... 计算 ...
return output # (B, num_heads, S, head_dim) -> (B, S, H)
这个特性的意义在于:在编译期就能捕获矩阵维度不匹配的错误,而不是等到运行时才发现 matmul 报了 shape 错误。对于训练大型模型的研究者来说,这能节省大量调试时间。
3.3 独特能力二:Pydantic 深度集成
Pyrefly 对 Pydantic 有原生级别的支持,不需要额外的 stub 文件或插件配置:
from pydantic import BaseModel, Field, validator
from typing import List, Optional
class UserProfile(BaseModel):
user_id: int = Field(..., gt=0, description="用户ID,必须为正整数")
username: str = Field(..., min_length=3, max_length=20, pattern=r"^[a-zA-Z][a-zA-Z0-9_]*$")
email: str = Field(...)
age: Optional[int] = Field(None, ge=0, le=150)
tags: List[str] = Field(default_factory=list)
@validator("email")
def validate_email(cls, v: str) -> str:
if "@" not in v:
raise ValueError("邮箱格式不正确")
return v.lower()
# Pyrefly 理解 Pydantic 的约束
def get_user_age(user: UserProfile) -> int:
return user.age # ✅ Pyrefly 知道这是 Optional[int]
def get_user_id(user: UserProfile) -> int:
# Pyrefly 理解 Field(..., gt=0) 意味着运行时 user_id > 0
# 在经过验证的模型实例上,Pyrefly 可以推断 user_id 是正整数
if user.user_id > 0:
return user.user_id
return 0 # 这个分支永远不会执行,但 Pyrefly 需要类型兼容
# 传入未验证的字典时的类型安全
raw_data: dict = {"user_id": "not_an_int", "username": "ab"} # 类型不够精确
# Pyrefly 能理解从 dict 到 BaseModel 的转换过程中会发生什么
user = UserProfile(**raw_data) # 运行时验证,Pydantic 会在运行时捕获错误
3.4 独特能力三:Dataclass 和 attrs 原生支持
Pyrefly v1.2 开始内置对 attrs 的支持,不需要插件配置:
import attr
@attr.s(auto_attribs=True, slots=True)
class Config:
host: str = attr.ib()
port: int = attr.ib(default=8080)
timeout: float = attr.ib(default=30.0)
debug: bool = attr.ib(default=False)
@attr.s
class Builder:
_host: str = attr.ib()
_port: int = attr.ib(default=8080)
def build(self) -> Config:
return Config(host=self._host, port=self._port)
# Pyrefly 能理解 @attr.s 生成的 __init__ 签名
def create_config(host: str, port: int = 8080) -> Config:
return Config(host=host, port=port)
config = create_config("localhost") # ✅ 正确
config2 = create_config("localhost", "not_an_int") # ❌ Pyrefly 报错:第二个参数应为 int
四、AI 编程时代的类型检查器:为什么 Pyrefly 是 Claude/GPT 的最佳拍档
4.1 AI 生成的代码为什么特别需要类型检查
当 AI 帮你写代码时,有一个微妙但重要的现象:AI 生成的代码在「语法正确性」上表现很好,但在「类型正确性」上容易出错。
原因很直观:
- AI 训练数据中的类型注解质量参差不齐:很多开源代码没有类型注解,AI 学会了「能跑就行」的编程风格
- 类型约束的逻辑链条很长:一个看似简单的
user.profile.address.city链式访问,背后涉及 4-5 个类的类型定义,AI 很难完美推断 - 泛型和协议(Protocol)的使用最薄弱:AI 倾向于写具体的类型而非抽象的类型
# AI 生成的代码中最常见的类型问题
# 问题1: 字典类型过于宽泛
def get_user_name(user: dict) -> str: # AI 倾向用 dict 而不是 dataclass/typed dict
return user["name"] # 如果 user 是空字典,这里会 KeyError
# 问题2: None 检查遗漏
def process_item(item: Optional[Item]) -> str:
return item.name # ❌ 如果 item 是 None,这里 AttributeError
# 问题3: 类型推断链断裂
def transform(data: list) -> list:
result = []
for item in data:
result.append(item.value) # AI 不知道 item 是什么类型,也不知道 .value 属性是否存在
return result
4.2 Pyrefly 的 AI 集成特性:Agentic Loop
Pyrefly 官方博客专门讨论了 Type Checking in Agentic Workflows(代理工作流中的类型检查)。核心观点是:
AI 编程循环 = 生成 → 检查 → 修正 → 验证
Pyrefly 在这个循环中扮演「把关者」的角色:
# 演示:AI Agent 使用 Pyrefly 的典型流程
# Step 1: AI 生成代码
# 假设 AI 生成了这样的代码:
def calculate_stats(numbers: list[int]) -> dict:
total = sum(numbers)
average = total / len(numbers)
return {
"total": total,
"average": average,
"median": numbers[len(numbers) // 2] # 这里有问题:没有排序!
}
# Step 2: 运行 Pyrefly
# $ pyrefly check stats.py
# Error: List index out of range at line 7
# Error: Unsorted list may cause incorrect median calculation
# Step 3: AI 看到错误,修正代码
from statistics import median
def calculate_stats(numbers: list[int]) -> dict:
sorted_numbers = sorted(numbers)
return {
"total": sum(sorted_numbers),
"average": sum(sorted_numbers) / len(sorted_numbers),
"median": median(sorted_numbers)
}
# Step 4: Pyrefly 再次检查
# $ pyrefly check stats.py
# ✅ No errors
# Step 5: 继续下一个任务
4.3 性能是 AI 集成的关键
为什么说 185万行/秒的速度 对 AI 编程特别重要?
因为 AI 编程的本质是快速迭代循环:生成 → 检查 → 修正 → 验证 → 生成 → ...
如果每次类型检查需要等待 30 秒,这个循环就变得很慢,开发者的「心流」被打断。Pyrefly 的极速意味着:
- 每次保存文件 < 100ms 就能得到诊断结果
- CI 流程中多个 AI Agent 并行检查不同模块时,不会相互等待
- 在大型代码库上,AI 可以实时看到修改后的完整类型检查结果
五、实战指南:从安装到深度配置
5.1 安装与基础使用
# 安装 Pyrefly(Python >= 3.9)
pip install pyrefly
# 初始化项目(在项目根目录运行)
cd your-project
pyrefly init
# 这会创建 .pyrefly 配置文件
# 以及 .pyrightconfig.json(如果已使用 Pyright,会自动迁移)
# 运行类型检查
pyrefly check
# 仅检查特定文件
pyrefly check src/models/user.py
# 监视模式(文件变化时自动重新检查)
pyrefly watch
5.2 VSCode 集成
# 从 VSCode Marketplace 安装 "Pyrefly" 扩展
# 或者从 OpenVSX 安装(适用于非微软商店的 VSCode 衍生版)
# 安装后,VSCode 会自动使用 Pyrefly 作为 Python 语言的 Language Server
# 提供:
# - 实时代码补全(带类型信息)
# - 悬停文档
# - 跳转到定义
# - 重构工具
# - 实时代断错误标注
5.3 CI 集成配置
# .github/workflows/typecheck.yml
name: Type Check
on: [push, pull_request]
jobs:
typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install pyrefly
- name: Run Pyrefly
run: pyrefly check
5.4 高级配置
// .pyrefly 配置文件
{
"include": ["src/**/*.py"],
"exclude": ["**/__pycache__", "**/node_modules", "**/.venv"],
// 类型检查严格度
"check": {
"unknown": true, // 检查未知类型(类似 mypy --disallow-untyped-defs)
"reportMissingTypeStubs": false,
"declarationDistance": true, // 报告离定义位置过远的类型注解
},
// Python 版本
"pythonVersion": "3.11",
// 性能调优
"parallel": {
"workers": 4, // 显式设置并行工作线程数
"lazyCheck": true // 延迟检查,只检查当前可见的文件
}
}
六、横向对比:Pyrefly vs Pyright vs Mypy
| 维度 | Pyrefly | Pyright | Mypy |
|---|---|---|---|
| 实现语言 | Rust | TypeScript (Node.js) | Python |
| 性能 | ⚡ 185万行/秒 | ⚡ 10-15万行/秒 | 🐢 1-2万行/秒 |
| IDE 集成 | ✅ LSP 原生支持 | ✅ LSP 原生支持 | ⚠️ 需要额外插件 |
| Tensor Shapes | ✅ 独有特性 | ❌ 不支持 | ❌ 不支持 |
| attrs 支持 | ✅ 原生 | ⚠️ 需要 stub | ⚠️ 需要插件 |
| Pydantic 支持 | ✅ 深度集成 | ⚠️ 部分支持 | ⚠️ 需要插件 |
| 严格度 | 中高 | 可配置 | 可配置 |
| 生态成熟度 | 成长中 | 成熟 | 非常成熟 |
| 类型规范合规 | 高 | 非常高 | 高 |
| 内存占用 | 低(Rust) | 中(JS) | 高(Python) |
选型建议:
- 大型科学计算项目(PyTorch、TensorFlow、 JAX)→ Pyrefly,Tensor Shapes 是独家优势
- 通用 Python 项目,追求稳定性 → Pyright,生态最成熟
- 遗留项目,需要宽松检查 → Mypy,配置最灵活
- AI 编程辅助场景 → Pyrefly,速度和 AI 集成特性最优
七、总结与展望
Pyrefly 的出现,标志着 Python 类型检查生态进入了一个新的阶段。它不是对 Pyright 或 Mypy 的简单复制,而是一次基于多年实践经验的架构重构。
核心价值:
- 速度革命:185万行/秒的检查速度,让类型检查从「CI 流程中的瓶颈」变成了「开发时的实时反馈」
- AI 原生:Tensor Shapes、Pydantic 深度集成、Agentic Loop 支持,精准命中 AI 编程时代的需求
- 工程品质:Rust 实现带来了极低的内存占用和无 GC 停顿,在大型代码库上表现稳定
展望:
- 随着 Pyrefly 生态的成熟,我们可以期待更多 AI 编程工具将其作为默认类型检查器
- Tensor Shapes 可能会演进为 Python 类型系统的一部分(PEP 提案?)
- Meta 内部的持续使用会推动 Pyrefly 在边缘场景(如分布式类型检查、增量 CI)上的进一步优化
对于 Python 开发者来说,2026年是值得记住的一年:TypeScript 7.0 用 Go 重写了编译器,Python 类型检查器也在用 Rust 重塑自我。编程语言和工具链正在经历一场静悄悄的「性能革命」。
参考链接:
- Pyrefly 官网:https://pyrefly.org/
- GitHub 仓库:https://github.com/facebook/pyrefly
- 性能对比博客:https://pyrefly.org/blog/speed-and-memory-comparison/
- 架构演进博客:https://pyrefly.org/blog/lessons-from-pyre/
- Tensor Shapes 文档:https://pyrefly.org/en/docs/tensor-shapes/