diff --git a/pytools/__init__.py b/pytools/__init__.py
index a02855cb8dd4735fbfc9abfbe5f9688a3ea76fd5..07554965a04ddb06399e1484872fb699568b0dfc 100644
--- a/pytools/__init__.py
+++ b/pytools/__init__.py
@@ -1750,6 +1750,18 @@ def generate_unique_names(prefix):
         try_num += 1
 
 
+def generate_numbered_unique_names(prefix, num=None):
+    orig_num = num
+    num = 0
+    if orig_num is None:
+        yield (num, prefix)
+
+    while True:
+        name = "%s_%d" % (prefix, num)
+        num += 1
+        yield (num, name)
+
+
 generate_unique_possibilities = MovedFunctionDeprecationWrapper(
         generate_unique_names)
 
@@ -1758,6 +1770,7 @@ class UniqueNameGenerator:
     def __init__(self, existing_names=set(), forced_prefix=""):
         self.existing_names = existing_names.copy()
         self.forced_prefix = forced_prefix
+        self.prefix_to_counter = {}
 
     def is_name_conflicting(self, name):
         return name in self.existing_names
@@ -1777,10 +1790,14 @@ class UniqueNameGenerator:
     def __call__(self, based_on="id"):
         based_on = self.forced_prefix + based_on
 
-        for var_name in generate_unique_names(based_on):
+        counter = self.prefix_to_counter.get(based_on, None)
+
+        for counter, var_name in generate_numbered_unique_names(based_on, counter):
             if not self.is_name_conflicting(var_name):
                 break
 
+        self.prefix_to_counter[based_on] = counter
+
         var_name = intern(var_name)
 
         self.existing_names.add(var_name)