Skip to content

Commit

Permalink
[PR #8535/7108d646 backport][3.10] Small speed up to cookiejar filter…
Browse files Browse the repository at this point in the history
…_cookies (#8537)

**This is a backport of PR #8535 as merged into master
(7108d64).**


<!-- Thank you for your contribution! -->

## What do these changes do?
 
Small speed up to cookiejar

Using `str.format` is ~16% faster than the lambda

followup to
#7944 (comment). I
was hoping to use `join` there but later realized `str.format` will take
`*args`

## Are there changes in behavior for the user?

no
## Is it a substantial burden for the maintainers to support this?

no


benchmark
```python
import timeit
import itertools

_FORMAT_PATH = "{0}/{1}".format

path = "lolonglonglonglonglonglongng/path/to/a/file"

print(
    timeit.timeit(
        'itertools.accumulate(path.split("/"), _FORMAT_PATH)', globals=globals()
    )
)


print(
    timeit.timeit(
        'itertools.accumulate(path.split("/"), lambda x, y: f"{x}/{y}")',
        globals=globals(),
    )
)
```

Co-authored-by: J. Nick Koston <[email protected]>
  • Loading branch information
patchback[bot] and bdraco authored Jul 25, 2024
1 parent 5621ecf commit 3baa6de
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 4 deletions.
3 changes: 3 additions & 0 deletions CHANGES/8535.misc.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Improve performance of filtering cookies -- by :user:`bdraco`.

This change is a followup to the improvements in :issue:`7583`
11 changes: 7 additions & 4 deletions aiohttp/cookiejar.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down Expand Up @@ -274,12 +278,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)

Expand Down

0 comments on commit 3baa6de

Please sign in to comment.