From e4778f62987007ec479ea99fffe77cda7c9bf581 Mon Sep 17 00:00:00 2001 From: "qwen.ai[bot]" Date: Wed, 12 Aug 2026 13:40:32 +0000 Subject: [PATCH] perf: add lru_cache to hot path ASN parsing functions --- src/netsleuth/bgp.py | 2 ++ src/netsleuth/ip_geo.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/netsleuth/bgp.py b/src/netsleuth/bgp.py index ecf2be4..9f716c4 100644 --- a/src/netsleuth/bgp.py +++ b/src/netsleuth/bgp.py @@ -2,6 +2,7 @@ from __future__ import annotations import ipaddress from datetime import datetime, timedelta, timezone +from functools import lru_cache import httpx @@ -15,6 +16,7 @@ BULK_CALLS = {"bgp-updates", "routing-history", "bgplay", "announced-prefixes"} _UNSTABLE_WITHDRAWALS_PER_DAY = 3.0 +@lru_cache(maxsize=256) def _as_label(asn: object) -> str: text = str(asn).upper() return text if text.startswith("AS") else f"AS{text}" diff --git a/src/netsleuth/ip_geo.py b/src/netsleuth/ip_geo.py index a42853a..6eb8da7 100644 --- a/src/netsleuth/ip_geo.py +++ b/src/netsleuth/ip_geo.py @@ -2,12 +2,14 @@ from __future__ import annotations import ipaddress import re +from functools import lru_cache from netsleuth.models import CfTrace, IpGeo _AS_PREFIX_RE = re.compile(r"^AS(\d+)\s*(?P.*)$", re.IGNORECASE) +@lru_cache(maxsize=256) def _as_number(value: object) -> str | None: if value is None or value == "": return None @@ -20,6 +22,7 @@ def _as_number(value: object) -> str | None: return None +@lru_cache(maxsize=256) def _as_label(value: object) -> str | None: match = _AS_PREFIX_RE.match(str(value or "")) name = (match.group("name") if match else "").strip()