From: Daniele Varrazzo Date: Wed, 28 Sep 2022 01:01:52 +0000 (+0100) Subject: perf: use functools.cache where available X-Git-Tag: 3.1.3~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=598f121843dbabc99af6fd2e17ce49ba3fdf1496;p=thirdparty%2Fpsycopg.git perf: use functools.cache where available Faster than lru_cache; use it when we don't suppose we will ever evict values. --- diff --git a/psycopg/psycopg/_compat.py b/psycopg/psycopg/_compat.py index 16b1685c8..66d1c8392 100644 --- a/psycopg/psycopg/_compat.py +++ b/psycopg/psycopg/_compat.py @@ -29,10 +29,14 @@ else: if sys.version_info >= (3, 9): from zoneinfo import ZoneInfo + from functools import cache from collections import Counter, deque as Deque else: - from backports.zoneinfo import ZoneInfo from typing import Counter, Deque + from functools import lru_cache + from backports.zoneinfo import ZoneInfo + + cache = lru_cache(maxsize=None) if sys.version_info >= (3, 10): from typing import TypeAlias, TypeGuard @@ -52,5 +56,6 @@ __all__ = [ "TypeAlias", "TypeGuard", "ZoneInfo", + "cache", "create_task", ] diff --git a/psycopg/psycopg/_encodings.py b/psycopg/psycopg/_encodings.py index b1b21267c..ba09fd4ed 100644 --- a/psycopg/psycopg/_encodings.py +++ b/psycopg/psycopg/_encodings.py @@ -7,10 +7,10 @@ Mappings between PostgreSQL and Python encodings. import re import string import codecs -from functools import lru_cache from typing import Any, Dict, Optional, TYPE_CHECKING from .errors import NotSupportedError +from ._compat import cache if TYPE_CHECKING: from .pq.abc import PGconn @@ -116,7 +116,7 @@ def conninfo_encoding(conninfo: str) -> str: return "utf-8" -@lru_cache() +@cache def py2pgenc(name: str) -> bytes: """Convert a Python encoding name to PostgreSQL encoding name. @@ -125,7 +125,7 @@ def py2pgenc(name: str) -> bytes: return pg_codecs[codecs.lookup(name).name] -@lru_cache() +@cache def pg2pyenc(name: bytes) -> str: """Convert a Python encoding name to PostgreSQL encoding name. diff --git a/psycopg/psycopg/pq/misc.py b/psycopg/psycopg/pq/misc.py index 92be04965..57784419b 100644 --- a/psycopg/psycopg/pq/misc.py +++ b/psycopg/psycopg/pq/misc.py @@ -9,10 +9,10 @@ import sys import logging import ctypes.util from typing import cast, NamedTuple, Optional, Union -from functools import lru_cache from .abc import PGconn, PGresult from ._enums import ConnStatus, TransactionStatus, PipelineStatus +from .._compat import cache from .._encodings import pgconn_encoding logger = logging.getLogger("psycopg.pq") @@ -46,7 +46,7 @@ class PGresAttDesc(NamedTuple): atttypmod: int -@lru_cache() +@cache def find_libpq_full_path() -> Optional[str]: if sys.platform == "win32": libname = ctypes.util.find_library("libpq.dll") diff --git a/psycopg/psycopg/types/array.py b/psycopg/psycopg/types/array.py index 569e61f66..5ecbac1fa 100644 --- a/psycopg/psycopg/types/array.py +++ b/psycopg/psycopg/types/array.py @@ -8,13 +8,13 @@ import re import struct from typing import Any, cast, Callable, Iterator, List from typing import Optional, Pattern, Set, Tuple, Type -from functools import lru_cache from .. import pq from .. import errors as e from .. import postgres from ..abc import AdaptContext, Buffer, Dumper, DumperKey, NoneType from ..adapt import RecursiveDumper, RecursiveLoader, PyFormat +from .._compat import cache from .._struct import pack_len, unpack_len from ..postgres import TEXT_OID, INVALID_OID from .._typeinfo import TypeInfo @@ -190,7 +190,7 @@ class ListDumper(BaseListDumper): return self._tx.get_dumper(item, PyFormat.TEXT).dump(item) -@lru_cache() +@cache def _get_needs_quotes_regexp(delimiter: bytes) -> Pattern[bytes]: """Return a regexp to recognise when a value needs quotes @@ -349,7 +349,7 @@ class ArrayLoader(BaseArrayLoader): _re_unescape = re.compile(rb"\\(.)") -@lru_cache() +@cache def _get_array_parse_regexp(delimiter: bytes) -> Pattern[bytes]: """ Return a regexp to tokenize an array representation into item and brackets