diff --git a/jedi/cache.py b/jedi/cache.py index 56769d0d..fe073352 100644 --- a/jedi/cache.py +++ b/jedi/cache.py @@ -163,6 +163,18 @@ def memoize_method(method): return wrapper +def memoize_function(obj): + """ A normal memoize function for memoizing free functions. """ + cache = obj.cache = {} + + def memoizer(*args, **kwargs): + key = str(args) + str(kwargs) + if key not in cache: + cache[key] = obj(*args, **kwargs) + return cache[key] + return memoizer + + def cache_star_import(func): @time_cache("star_import_cache_validity") def wrapper(self): diff --git a/jedi/evaluate/compiled/fake.py b/jedi/evaluate/compiled/fake.py index 0037cfc7..32c28b66 100644 --- a/jedi/evaluate/compiled/fake.py +++ b/jedi/evaluate/compiled/fake.py @@ -8,6 +8,7 @@ import os import inspect from jedi._compatibility import is_py3, builtins, unicode +from jedi.cache import memoize_function from jedi.parser import Parser, load_grammar from jedi.parser import tree as pt from jedi.evaluate.helpers import FakeName @@ -97,6 +98,7 @@ def _faked(module, obj, name): return search_scope(cls, name) +@memoize_function def get_faked(module, obj, name=None): obj = obj.__class__ if is_class_instance(obj) else obj result = _faked(module, obj, name)