]> granicus.if.org Git - python/commitdiff
Add comment to explain the implications of not sorting keywords (#3331)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Tue, 5 Sep 2017 00:47:53 +0000 (17:47 -0700)
committerGitHub <noreply@github.com>
Tue, 5 Sep 2017 00:47:53 +0000 (17:47 -0700)
In Python 3.6, sorted() was removed from _make_key() for the lru_cache and instead rely on guaranteed keyword argument order preservation.  This makes keyword argument handling faster but it also causes multiple callers with a different keyword argument order to be cached as separate items.  Depending on your point of view, this is either a performance regression (increased number of cache misses) or a performance enhancement (faster computation of keys).

Lib/functools.py

index 89f2cf4f5f7d6921b17c81f602da974d6de31038..0873f207154b7daab8a39c8fadc9923977e509f2 100644 (file)
@@ -432,6 +432,10 @@ def _make_key(args, kwds, typed,
     saves space and improves lookup speed.
 
     """
+    # All of code below relies on kwds preserving the order input by the user.
+    # Formerly, we sorted() the kwds before looping.  The new way is *much*
+    # faster; however, it means that f(x=1, y=2) will now be treated as a
+    # distinct call from f(y=2, x=1) which will be cached separately.
     key = args
     if kwds:
         key += kwd_mark