Commit ee86bf24 authored by Alex Gaynor's avatar Alex Gaynor Committed by Tim Graham
Browse files

[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 82e0cd15 from master
parent b44a56c3
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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()