[Python-checkins] python/dist/src/Lib/test test_itertools.py, 1.24, 1.25

rhettinger at users.sourceforge.net rhettinger at users.sourceforge.net
Wed Nov 12 09:32:28 EST 2003


Update of /cvsroot/python/python/dist/src/Lib/test
In directory sc8-pr-cvs1:/tmp/cvs-serv16547/Lib/test

Modified Files:
	test_itertools.py 
Log Message:
Improve the implementation of itertools.tee().

Formerly, underlying queue was implemented in terms of two lists.  The
new queue is a series of singly-linked fixed length lists.

The new implementation runs much faster, supports multi-way tees, and
allows tees of tees without additional memory costs.

The root ideas for this structure were contributed by Andrew Koenig
and Guido van Rossum.



Index: test_itertools.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_itertools.py,v
retrieving revision 1.24
retrieving revision 1.25
diff -C2 -d -r1.24 -r1.25
*** test_itertools.py	26 Oct 2003 15:34:50 -0000	1.24
--- test_itertools.py	12 Nov 2003 14:32:25 -0000	1.25
***************
*** 201,205 ****
  
      def test_tee(self):
!         n = 100
          def irange(n):
              for i in xrange(n):
--- 201,205 ----
  
      def test_tee(self):
!         n = 200
          def irange(n):
              for i in xrange(n):
***************
*** 218,231 ****
  
          a, b = tee(irange(n)) # test dealloc of leading iterator
!         self.assertEqual(a.next(), 0)
!         self.assertEqual(a.next(), 1)
          del a
          self.assertEqual(list(b), range(n))
  
          a, b = tee(irange(n)) # test dealloc of trailing iterator
!         self.assertEqual(a.next(), 0)
!         self.assertEqual(a.next(), 1)
          del b
!         self.assertEqual(list(a), range(2, n))
  
          for j in xrange(5):   # test randomly interleaved
--- 218,231 ----
  
          a, b = tee(irange(n)) # test dealloc of leading iterator
!         for i in xrange(100):
!             self.assertEqual(a.next(), i)
          del a
          self.assertEqual(list(b), range(n))
  
          a, b = tee(irange(n)) # test dealloc of trailing iterator
!         for i in xrange(100):
!             self.assertEqual(a.next(), i)
          del b
!         self.assertEqual(list(a), range(100, n))
  
          for j in xrange(5):   # test randomly interleaved
***************
*** 240,258 ****
              self.assertEqual(lists[1], range(n))
  
          self.assertRaises(TypeError, tee)
          self.assertRaises(TypeError, tee, 3)
          self.assertRaises(TypeError, tee, [1,2], 'x')
  
!         try:
!             class A(tee): pass
!         except TypeError:
!             pass
!         else:
!             self.fail("tee constructor should not be subclassable")
  
-         # tee_iterator should not be instantiable
-         a, b = tee(xrange(10))
-         self.assertRaises(TypeError, type(a))
-         self.assert_(a is iter(a))  # tee_iterator should support __iter__
  
      def test_StopIteration(self):
--- 240,268 ----
              self.assertEqual(lists[1], range(n))
  
+         # test argument format checking
          self.assertRaises(TypeError, tee)
          self.assertRaises(TypeError, tee, 3)
          self.assertRaises(TypeError, tee, [1,2], 'x')
+         self.assertRaises(TypeError, tee, [1,2], 3, 'x')
  
!         # tee object should be instantiable
!         a, b = tee('abc')
!         c = type(a)('def')
!         self.assertEqual(list(c), list('def'))
! 
!         # test long-lagged and multi-way split
!         a, b, c = tee(xrange(2000), 3)
!         for i in xrange(100):
!             self.assertEqual(a.next(), i)
!         self.assertEqual(list(b), range(2000))
!         self.assertEqual([c.next(), c.next()], range(2))
!         self.assertEqual(list(a), range(100,2000))
!         self.assertEqual(list(c), range(2,2000))
! 
!         # tee pass-through to copyable iterator
!         a, b = tee('abc')
!         c, d = tee(a)
!         self.assert_(a is c)
  
  
      def test_StopIteration(self):
***************
*** 318,328 ****
          self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a)
  
-     def test_tee(self):
-         a = []
-         p, q = t = tee([a]*2)
-         a += [a, p, q, t]
-         p.next()
-         del a, p, q, t
- 
  def R(seqn):
      'Regular generator'
--- 328,331 ----
***************
*** 627,631 ****
  ...     "s -> (s0,s1), (s1,s2), (s2, s3), ..."
  ...     a, b = tee(iterable)
! ...     return izip(a, islice(b, 1, None))
  
  This is not part of the examples but it tests to make sure the definitions
--- 630,638 ----
  ...     "s -> (s0,s1), (s1,s2), (s2, s3), ..."
  ...     a, b = tee(iterable)
! ...     try:
! ...         b.next()
! ...     except StopIteration:
! ...         pass
! ...     return izip(a, b)
  
  This is not part of the examples but it tests to make sure the definitions





More information about the Python-checkins mailing list