perf(792-2): 시트 다시 셈 서버 다듬기 — 자재 색인 · 찾기 답을 M01 색인에 한 번 · 합판 1.2~1.6 s → 62 ms

- `_Over` 덮개가 자재 색인(`_market` · `_by_class`) · 찾기 답(`_found`)을 속 M01 색인에 둠 — 셈마다 3만 줄 다시 안 지음 · M01 파일 자국이 바뀌면 새 색인 = 새로
- `master_pick.search` = 마스터 · 조건 · 지역 · 단위마다 한 번(`_search` 가 옛 몸) · 사본을 줌
- `calc_doc` = M01 `steady()` 안 — 한 셈 동안 파일 자국 한 번(37 번 → 1)
- 측정(8001 · 10 번 중앙값 · 옵션/상수/식/변수 줄) 합판 62/62/62/66 · 지게 30 · 굴착기 31~36 · 봉화 27 ms · 금액 전후 같음
- 엔진 일곱 번은 남김 — 한 번 ~5 ms · 목표 아래
- 시험 test_792_2_calc_speed(색인 다시 안 지음 · 자국 바뀌면 다시 · 층 섞임 없음 · 셈 답 같음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-05 18:44:03 +09:00
co-authored by Claude Opus 5.5
parent 538151177e
commit 80c3f72a24
3 changed files with 155 additions and 10 deletions
@@ -67,6 +67,19 @@ def _words(term) -> tuple[list[str], list[str]]:
def search(master, cond: dict, env: dict | None = None, unit: str | None = None) -> list[str]:
"""`_search` 를 마스터 색인 하나에 조건마다 한 번만(792-2) —
답은 마스터 · 조건 · 지역 · 단위만 따름."""
place = mm.plain(env[mm.REGION]) if (env or {}).get(mm.REGION) else ""
memo = getattr(master, "_found", None)
if memo is None:
memo = master._found = {}
key = tuple(str(cond.get(k) or "") for k in ("검색어", "구분", "상세구분")) + (place, str(unit))
if key not in memo:
memo[key] = _search(master, cond, env, unit)
return list(memo[key])
def _search(master, cond: dict, env: dict | None = None, unit: str | None = None) -> list[str]:
"""검색어 안 자재품목 키 — 낱말이 모두 이름 또는 규격에 든 줄(요소의 구분 · 상세구분 안에서) ·
단위는 같은 성격까지(하나도 없으면 다 — 경고가 붙음) · 고르는 차례:
값 있는 줄 → 줄 단위와 똑같은 단위 → 지역 낱말(입력 `자재지역` 포함)과 맞는 줄 → 키 차례."""