From d26cf2365dff77db57c8fc2302df6215cd692f05 Mon Sep 17 00:00:00 2001 From: gglamer Date: Sat, 26 Sep 2026 19:27:52 +0000 Subject: [PATCH] =?UTF-8?q?perf:=20=D1=80=D0=B0=D0=B7=D0=B1=D0=BE=D1=80=20?= =?UTF-8?q?YAML=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B5=D0=B2?= =?UTF-8?q?=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20libyaml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/dialog/tree.py | 5 ++++- backend/app/scenarios/loader.py | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/backend/app/dialog/tree.py b/backend/app/dialog/tree.py index a78be54..9b4ee23 100644 --- a/backend/app/dialog/tree.py +++ b/backend/app/dialog/tree.py @@ -22,6 +22,7 @@ from app.domain.events import Mood log = logging.getLogger(__name__) LIBRARY = Path(__file__).resolve().parents[3] / "scenarios" / "pregenerated" +_Loader = getattr(yaml, "CSafeLoader", yaml.SafeLoader) def table_path(scenario_id: str) -> Path: @@ -40,7 +41,9 @@ class TreeCaller: """ def __init__(self, scenario_id: str) -> None: - self._table = yaml.safe_load(table_path(scenario_id).read_text(encoding="utf-8")) or {} + self._table = yaml.load( + table_path(scenario_id).read_text(encoding="utf-8"), Loader=_Loader + ) or {} self._fallback = TemplateCaller() self._turn = 0 self.misses = 0 diff --git a/backend/app/scenarios/loader.py b/backend/app/scenarios/loader.py index 7645088..eaad57b 100644 --- a/backend/app/scenarios/loader.py +++ b/backend/app/scenarios/loader.py @@ -14,6 +14,10 @@ from app.domain import ekp from app.domain.classifiers import DDS_BY_INCIDENT from app.scenarios.schema import ChecklistItem, Scenario +# Библиотека читается на каждом старте приложения, а в тестах — на каждый +# TestClient: чистый Python-парсер тратит на неё ~1.7 с, libyaml — ~0.2 с. +_Loader = getattr(yaml, "CSafeLoader", yaml.SafeLoader) + class ScenarioError(Exception): """Ошибка библиотеки. Текст пишется для методиста, не для программиста.""" @@ -21,7 +25,7 @@ class ScenarioError(Exception): def _read_yaml(path: Path) -> dict: try: - data = yaml.safe_load(path.read_text(encoding="utf-8")) + data = yaml.load(path.read_text(encoding="utf-8"), Loader=_Loader) except yaml.YAMLError as exc: raise ScenarioError(f"{path.name}: битый YAML — {exc}") from exc if not isinstance(data, dict):