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 (aio-libs#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
```
  • Loading branch information
Rongronggg9 authored Nov 12, 2023
1 parent 7ed2dd3 commit dfc3f89
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 1 deletion.
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 @@ -282,6 +282,7 @@ Robert Lu
Robert Nikolich
Roman Markeloff
Roman Podoliaka
Rong Zhang
Samir Akarioh
Samuel Colvin
Sean Hunt
Expand Down
8 changes: 7 additions & 1 deletion aiohttp/cookiejar.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,6 @@ 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()
if not isinstance(request_url, URL):
warnings.warn(
"The method accepts yarl.URL instances only, got {}".format(
Expand All @@ -246,6 +245,13 @@ def filter_cookies(
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
hostname = request_url.raw_host or ""
request_origin = URL()
with contextlib.suppress(ValueError):
Expand Down

0 comments on commit dfc3f89

Please sign in to comment.