diff --git a/CHANGES/8535.misc.rst b/CHANGES/8535.misc.rst new file mode 100644 index 00000000000..e1acc438695 --- /dev/null +++ b/CHANGES/8535.misc.rst @@ -0,0 +1,3 @@ +Improve performance of filtering cookies -- by :user:`bdraco`. + +This change is a followup to the improvements in :issue:`7583` diff --git a/aiohttp/cookiejar.py b/aiohttp/cookiejar.py index da16254310f..396016a69ff 100644 --- a/aiohttp/cookiejar.py +++ b/aiohttp/cookiejar.py @@ -36,6 +36,10 @@ CookieItem = Union[str, "Morsel[str]"] +# We cache these string methods here as their use is in performance critical code. +_FORMAT_PATH = "{}/{}".format +_FORMAT_DOMAIN_REVERSED = "{1}.{0}".format + class CookieJar(AbstractCookieJar): """Implements cookie storage adhering to RFC 6265.""" @@ -279,12 +283,11 @@ def filter_cookies(self, request_url: URL = URL()) -> "BaseCookie[str]": else: # Get all the subdomains that might match a cookie (e.g. "foo.bar.com", "bar.com", "com") domains = itertools.accumulate( - reversed(hostname.split(".")), lambda x, y: f"{y}.{x}" + reversed(hostname.split(".")), _FORMAT_DOMAIN_REVERSED ) + # Get all the path prefixes that might match a cookie (e.g. "", "/foo", "/foo/bar") - paths = itertools.accumulate( - request_url.path.split("/"), lambda x, y: f"{x}/{y}" - ) + paths = itertools.accumulate(request_url.path.split("/"), _FORMAT_PATH) # Create every combination of (domain, path) pairs. pairs = itertools.product(domains, paths)