Skip to content

Commit

Permalink
Skip filtering CookieJar when the jar is empty or all cookies hav…
Browse files Browse the repository at this point in the history
…e expired (#7819)

The filtering itself and its preparation in `CookieJar.filter_cookies()`
is expensive. Sometimes there are no cookies in the jar or all cookies
have expired. Skip filtering and its preparation in this case.

Because the empty check is much cheaper than `_do_expiration()`, I think
it deserves to be duplicated before and after calling
`_do_expiration()`.

```console
$ python3.11 -m timeit -s 'from collections import defaultdict; d=defaultdict(foo="bar")' \
> 'if not d: pass'
50000000 loops, best of 5: 8.3 nsec per loop
$ python3.11 -m timeit -s 'from collections import defaultdict; d=defaultdict()' \
> 'if not d: pass'
50000000 loops, best of 5: 8.74 nsec per loop
$ python3.11 -m timeit -s 'from aiohttp import CookieJar; cj = CookieJar()' \
> 'cj._do_expiration()'
200000 loops, best of 5: 1.86 usec per loop
```

(cherry picked from commit dfc3f89)
  • Loading branch information
Rongronggg9 committed Nov 12, 2023
1 parent fffc433 commit e6c071a
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGES/7819.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Skip filtering ``CookieJar`` when the jar is empty or all cookies have expired.
1 change: 1 addition & 0 deletions CONTRIBUTORS.txt
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ Required Field
Robert Lu
Robert Nikolich
Roman Podoliaka
Rong Zhang
Samir Akarioh
Samuel Colvin
Sean Hunt
Expand Down
10 changes: 8 additions & 2 deletions aiohttp/cookiejar.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,11 +236,17 @@ def filter_cookies(
self, request_url: URL = URL()
) -> Union["BaseCookie[str]", "SimpleCookie[str]"]:
"""Returns this jar's cookies filtered by their attributes."""
self._do_expiration()
request_url = URL(request_url)
filtered: Union["SimpleCookie[str]", "BaseCookie[str]"] = (
SimpleCookie() if self._quote_cookie else BaseCookie()
)
if not self._cookies:
# Skip do_expiration() if there are no cookies.
return filtered
self._do_expiration()
if not self._cookies:
# Skip rest of function if no non-expired cookies.
return filtered

Check warning on line 248 in aiohttp/cookiejar.py

View check run for this annotation

Codecov / codecov/patch

aiohttp/cookiejar.py#L248

Added line #L248 was not covered by tests
request_url = URL(request_url)
hostname = request_url.raw_host or ""
request_origin = URL()
with contextlib.suppress(ValueError):
Expand Down

0 comments on commit e6c071a

Please sign in to comment.