diff options
| author | Alex Gaynor <alex.gaynor@gmail.com> | 2015-02-08 12:14:30 -0600 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-02-08 14:57:19 -0500 |
| commit | ee86bf24d269869012d5538c22d37588cec68685 (patch) | |
| tree | 18ce1e9f0e1579cb40cdc60ac74c9417b53bc58b | |
| parent | b44a56c3080312ab94679a396e6b60a18f9b6463 (diff) | |
[1.8.x] Optimized allow_lazy() by not generating a new lazy wrapper on each invocation.
This dramatically improves performance on PyPy. The following benchmark:
python -mtimeit -s "from django.utils.functional import allow_lazy; from django.utils.translation import ugettext_lazy; f = allow_lazy(lambda s: s, str)" "f(ugettext_lazy('abc'))"
goes from 390us per loop to 165us.
Backport of 82e0cd15711c7171aed7af5e481967cc721c9642 from master
| -rw-r--r-- | django/utils/functional.py | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/django/utils/functional.py b/django/utils/functional.py index 37cc7c7f0f..628e02e8d8 100644 --- a/django/utils/functional.py +++ b/django/utils/functional.py @@ -205,6 +205,8 @@ def allow_lazy(func, *resultclasses): immediately, otherwise a __proxy__ is returned that will evaluate the function when needed. """ + lazy_func = lazy(func, *resultclasses) + @wraps(func) def wrapper(*args, **kwargs): for arg in list(args) + list(six.itervalues(kwargs)): @@ -212,7 +214,7 @@ def allow_lazy(func, *resultclasses): break else: return func(*args, **kwargs) - return lazy(func, *resultclasses)(*args, **kwargs) + return lazy_func(*args, **kwargs) return wrapper empty = object() |
