[Python-checkins] Consistently move the misses update to just before the user function call (GH-11715)

Raymond Hettinger webhook-mailer at python.org
Thu Jan 31 18:03:55 EST 2019


https://github.com/python/cpython/commit/ffdf1c30ab6940a5efe6f33e61678021d9fd14b6
commit: ffdf1c30ab6940a5efe6f33e61678021d9fd14b6
branch: master
author: Raymond Hettinger <rhettinger at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2019年01月31日T15:03:38-08:00
summary:
Consistently move the misses update to just before the user function call (GH-11715)
files:
M Lib/functools.py
M Modules/_functoolsmodule.c
diff --git a/Lib/functools.py b/Lib/functools.py
index 6233c30c203e..fe47600caa1a 100644
--- a/Lib/functools.py
+++ b/Lib/functools.py
@@ -541,10 +541,10 @@ def _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo):
 if maxsize == 0:
 
 def wrapper(*args, **kwds):
- # No caching -- just a statistics update after a successful call
+ # No caching -- just a statistics update
 nonlocal misses
- result = user_function(*args, **kwds)
 misses += 1
+ result = user_function(*args, **kwds)
 return result
 
 elif maxsize is None:
@@ -557,9 +557,9 @@ def wrapper(*args, **kwds):
 if result is not sentinel:
 hits += 1
 return result
+ misses += 1
 result = user_function(*args, **kwds)
 cache[key] = result
- misses += 1
 return result
 
 else:
diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c
index 141210204ca5..d72aaff2b13c 100644
--- a/Modules/_functoolsmodule.c
+++ b/Modules/_functoolsmodule.c
@@ -796,10 +796,12 @@ lru_cache_make_key(PyObject *args, PyObject *kwds, int typed)
 static PyObject *
 uncached_lru_cache_wrapper(lru_cache_object *self, PyObject *args, PyObject *kwds)
 {
- PyObject *result = PyObject_Call(self->func, args, kwds);
+ PyObject *result;
+
+ self->misses++;
+ result = PyObject_Call(self->func, args, kwds);
 if (!result)
 return NULL;
- self->misses++;
 return result;
 }
 
@@ -827,6 +829,7 @@ infinite_lru_cache_wrapper(lru_cache_object *self, PyObject *args, PyObject *kwd
 Py_DECREF(key);
 return NULL;
 }
+ self->misses++;
 result = PyObject_Call(self->func, args, kwds);
 if (!result) {
 Py_DECREF(key);
@@ -838,7 +841,6 @@ infinite_lru_cache_wrapper(lru_cache_object *self, PyObject *args, PyObject *kwd
 return NULL;
 }
 Py_DECREF(key);
- self->misses++;
 return result;
 }
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /