diff --git a/python/dune/perftool/generation/__init__.py b/python/dune/perftool/generation/__init__.py
index e541e71366371039157cb757201f710ffd0a19ca..b3974b5d9df7990d35a68af1b20cf1e54fde9c1d 100644
--- a/python/dune/perftool/generation/__init__.py
+++ b/python/dune/perftool/generation/__init__.py
@@ -49,6 +49,7 @@ from dune.perftool.generation.loopy import (barrier,
                                             valuearg,
                                             )
 
-from dune.perftool.generation.context import (global_context,
+from dune.perftool.generation.context import (cache_restoring,
+                                              global_context,
                                               get_global_context_value,
                                               )
diff --git a/python/dune/perftool/generation/cache.py b/python/dune/perftool/generation/cache.py
index b4ae54f28479d607907ac59c3c6078283535bc85..31b1b85e0da2797a158b4d49ed10bdf89d7dfe0b 100644
--- a/python/dune/perftool/generation/cache.py
+++ b/python/dune/perftool/generation/cache.py
@@ -268,7 +268,7 @@ def delete_cache_items(condition=True, keep=False):
         gen._memoize_cache = _filter_cache_items(gen, condition)
 
 
-def retrieve_cache_functions(condition=True):
+def retrieve_cache_functions(condition="True"):
     return [g.func for g in _generators if eval(condition, _ConditionDict(g.item_tags))]
 
 
diff --git a/python/dune/perftool/generation/context.py b/python/dune/perftool/generation/context.py
index 55feda422efbabe48c7663e87fea289585253cde..2dca239d8a26f17aee1546ea76fb763e21c2756c 100644
--- a/python/dune/perftool/generation/context.py
+++ b/python/dune/perftool/generation/context.py
@@ -31,3 +31,22 @@ def global_context(**kwargs):
 
 def get_global_context_value(key, default=None):
     return _global_context_cache.get(key, default)
+
+
+class _CacheRestoringContext(object):
+    def __enter__(self):
+        from dune.perftool.generation.cache import _generators as g
+        self.cache = {}
+        for i in g:
+            self.cache[i] = {}
+            for k, v in i._memoize_cache.items():
+                self.cache[i][k] = v
+
+    def __exit__(self, exc_type, exc_value, traceback):
+        for i, c in self.cache.items():
+            for k, v in c.items():
+                i._memoize_cache[k] = v
+
+
+def cache_restoring():
+    return _CacheRestoringContext()
diff --git a/python/dune/perftool/sumfact/autotune.py b/python/dune/perftool/sumfact/autotune.py
index 8d171ecf8921eb7c1dc8ee21a1df310baafedfb6..8199196f25392bab32518b7220a7026b16edfbc0 100644
--- a/python/dune/perftool/sumfact/autotune.py
+++ b/python/dune/perftool/sumfact/autotune.py
@@ -1,6 +1,6 @@
 """ Autotuning for sum factorization kernels """
 
-from dune.perftool.generation import delete_cache_items
+from dune.perftool.generation import cache_restoring, delete_cache_items
 from dune.perftool.loopy.target import DuneTarget
 from dune.perftool.sumfact.realization import realize_sumfact_kernel_function
 from dune.perftool.options import get_option
@@ -169,7 +169,9 @@ def autotune_realization(sf):
     logname = "{}.log".format(name)
 
     # Generate and compile a benchmark program
-    generate_standalone_code(sf, filename, logname)
+    with cache_restoring():
+        generate_standalone_code(sf, filename, logname)
+
     ret = subprocess.call(compiler_invocation(name, filename))
     assert ret == 0