Skip to content

Commit 52eb94a

Browse files
Speed up the PageIterator by evaluating items once per page (#572)
The `firebase_admin.auth.list_users().iterate_all()` method uses a sub-class of PageIterator, which happens to access the .items computed property more than once for every page of results. This has been changed so we take care not to access the `self.items` property more than once per page. This is a lot faster.
1 parent 01db7eb commit 52eb94a

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

firebase_admin/_auth_utils.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,30 +43,32 @@ class PageIterator:
4343
def __init__(self, current_page):
4444
if not current_page:
4545
raise ValueError('Current page must not be None.')
46+
4647
self._current_page = current_page
47-
self._index = 0
48+
self._iter = None
49+
50+
def __next__(self):
51+
if self._iter is None:
52+
self._iter = iter(self.items)
4853

49-
def next(self):
50-
if self._index == len(self.items):
54+
try:
55+
return next(self._iter)
56+
except StopIteration:
5157
if self._current_page.has_next_page:
5258
self._current_page = self._current_page.get_next_page()
53-
self._index = 0
54-
if self._index < len(self.items):
55-
result = self.items[self._index]
56-
self._index += 1
57-
return result
58-
raise StopIteration
59+
self._iter = iter(self.items)
5960

60-
@property
61-
def items(self):
62-
raise NotImplementedError
61+
return next(self._iter)
6362

64-
def __next__(self):
65-
return self.next()
63+
raise
6664

6765
def __iter__(self):
6866
return self
6967

68+
@property
69+
def items(self):
70+
raise NotImplementedError
71+
7072

7173
def get_emulator_host():
7274
emulator_host = os.getenv(EMULATOR_HOST_ENV_VAR, '')

0 commit comments

Comments
 (0)