diff --git a/lib/Projectrans/Phase2Translator.py b/lib/Projectrans/Phase2Translator.py index 87a1be5..983a453 100644 --- a/lib/Projectrans/Phase2Translator.py +++ b/lib/Projectrans/Phase2Translator.py @@ -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())