]> granicus.if.org Git - python/commitdiff
Issue #18962: Optimize the single iterator case for heapq.merge()
authorRaymond Hettinger <python@rcn.com>
Wed, 11 Sep 2013 06:15:40 +0000 (01:15 -0500)
committerRaymond Hettinger <python@rcn.com>
Wed, 11 Sep 2013 06:15:40 +0000 (01:15 -0500)
Suggested by Wouter Bolsterlee.

Lib/heapq.py
Misc/ACKS

index 00b429c2d36ea41ac4a234556126a80555a8f038..d615239b94608a89ffd570724953347d7e0cd675 100644 (file)
@@ -358,6 +358,7 @@ def merge(*iterables):
 
     '''
     _heappop, _heapreplace, _StopIteration = heappop, heapreplace, StopIteration
+    _len = len
 
     h = []
     h_append = h.append
@@ -369,17 +370,20 @@ def merge(*iterables):
             pass
     heapify(h)
 
-    while 1:
+    while _len(h) > 1:
         try:
-            while 1:
-                v, itnum, next = s = h[0]   # raises IndexError when h is empty
+            while True:
+                v, itnum, next = s = h[0]
                 yield v
                 s[0] = next()               # raises StopIteration when exhausted
                 _heapreplace(h, s)          # restore heap condition
         except _StopIteration:
             _heappop(h)                     # remove empty iterator
-        except IndexError:
-            return
+    if h:
+        # fast case when only a single iterator remains
+        v, itnum, next = h[0]
+        yield v
+        yield from next.__self__
 
 # Extend the implementations of nsmallest and nlargest to use a key= argument
 _nsmallest = nsmallest
index 030f98064b06b2198390c55546b2c8a8de6bcc66..9d0dc46800283fa605eeff2282b62f9645464ff0 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -135,6 +135,7 @@ Paul Boddie
 Matthew Boedicker
 Robin Boerdijk
 David Bolen
+Wouter Bolsterlee
 Gawain Bolton
 Forest Bond
 Gregory Bond