]> granicus.if.org Git - python/commitdiff
Issue 7764: Improve recipe for itertools.consume().
authorRaymond Hettinger <python@rcn.com>
Sun, 24 Jan 2010 03:34:56 +0000 (03:34 +0000)
committerRaymond Hettinger <python@rcn.com>
Sun, 24 Jan 2010 03:34:56 +0000 (03:34 +0000)
Doc/library/itertools.rst

index 229bc1f98f36b7f944e50c65caebb90c32c2a5c0..250c84249e31cf962d6ec3afde1a5fec21dc3cb9 100644 (file)
@@ -641,7 +641,13 @@ which incur interpreter overhead.
 
    def consume(iterator, n):
        "Advance the iterator n-steps ahead. If n is none, consume entirely."
-       collections.deque(islice(iterator, n), maxlen=0)
+       # The technique uses objects that consume iterators at C speed.
+       if n is None:
+           # feed the entire iterator into a zero-length deque
+           collections.deque(iterator, maxlen=0)
+       else:
+           # advance to the emtpy slice starting at position n
+           next(islice(iterator, n, n), None)
 
    def nth(iterable, n, default=None):
        "Returns the nth item or a default value"
@@ -751,3 +757,10 @@ which incur interpreter overhead.
        # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
        # unique_justseen('ABBCcAD', str.lower) --> A B C A D
        return imap(next, imap(itemgetter(1), groupby(iterable, key)))
+
+Note, many of the above recipes can be optimized by replacing global lookups
+with local variables defined as default values.  For example, the
+*dotproduct* recipe can be written as:
+
+   def dotproduct(vec1, vec2, sum=sum, imap=imap, mul=operator.mul):
+       return sum(imap(mul, vec1, vec2))