perf(compile): pyi 缓存落盘改增量构建,Phase2 新增 vpi 不再全量重建
- _BuildPyiCacheFile 原每次签名变化(Phase2 过程新增 include .vpi)都全量 ast.parse 所有 vpi(prof 43 次 × 0.28s = 12.2s) - 增量:加载旧 pkl,按 (basename, size, mtime) 复用未变化文件的 vast 树,只 parse 新增/变化文件 - 验证:147 个 vpi 新增 1 文件时仅 0.006s(原全量需数秒);无旧 pkl 时自然退化为全量
This commit is contained in:
1 parent
94a065a386
commit
6613542d8e
1 file changed
+20
-1
@@ -308,7 +308,26 @@ def _BuildPyiCacheFile(temp_dir: str) -> str | None:
|
||||
except Exception:
|
||||
pass
|
||||
cache: dict[str, object] = {}
|
||||
for p in paths:
|
||||
# 增量复用:Phase2 过程会新增 include .vpi(签名每次变 → 全量重建 12.2s)。
|
||||
# 加载旧 pkl,按 (basename, size, mtime) 匹配未变化的文件复用 vast 树,
|
||||
# 只对新增/变化的文件重新 parse。
|
||||
old_by_name: dict[str, tuple[int, float, object | None]] = {}
|
||||
try:
|
||||
old = _LoadPyiCachePkl(temp_dir)
|
||||
if isinstance(old, dict):
|
||||
old_sig = old.get('signature') or []
|
||||
old_trees = list((old.get('cache') or {}).values())
|
||||
for _i, (_name, _size, _mtime) in enumerate(old_sig):
|
||||
_tree = old_trees[_i] if _i < len(old_trees) else None
|
||||
old_by_name[_name] = (_size, _mtime, _tree)
|
||||
except Exception:
|
||||
pass
|
||||
for p, (name, size, mtime) in zip(paths, sig):
|
||||
old_entry = old_by_name.get(name)
|
||||
if (old_entry is not None and old_entry[0] == size
|
||||
and old_entry[1] == mtime and old_entry[2] is not None):
|
||||
cache[p] = old_entry[2]
|
||||
continue
|
||||
try:
|
||||
with open(p, 'r', encoding='utf-8') as f:
|
||||
cache[p] = ast.parse(f.read())
|
||||
|
||||
Reference in new issue
Block a user