[PATCH 4 of 5] revset: prefetch an attribute in _generatorset.__iter__

Pierre-Yves David pierre-yves.david at ens-lyon.org
Fri Sep 19 17:33:57 CDT 2014


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1411080765 25200
#      Thu Sep 18 15:52:45 2014 -0700
# Node ID bfaab5271eb80fd282784864193e0d57a1ceef89
# Parent  a2b305e889547516d7952ee8ecd67948cd8ff360
revset: prefetch an attribute in _generatorset.__iter__

Python's attribute lookup are expensible, lets do less of them.

This gives us a 7% speedup on this revset iteration (from 0.063403 to 0.059032)

diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -2655,16 +2655,17 @@ class _generatorset(object):
         #
         # Getting ride of it would provide an about 15% speed up on this
         # iteration.
         i = 0
         genlist = self._genlist
-        consume = self._consumegen()
+        nextrev = self._consumegen().next
+        _len = len # cache global lookup
         while True:
-            if i < len(genlist):
+            if i < _len(genlist):
                 yield genlist[i]
             else:
-                yield consume.next()
+                yield nextrev()
             i += 1
 
     def _consumegen(self):
         cache = self._cache
         genlist = self._genlist.append


More information about the Mercurial-devel mailing list