[Python-checkins] python/dist/src/Lib sets.py,1.6,1.7

rhettinger@users.sourceforge.net rhettinger@users.sourceforge.net
Tue, 20 Aug 2002 18:35:31 -0700


Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv4509

Modified Files:
	sets.py 
Log Message:
Optimize try/except ordering in sets.py.

Gains a 5:1 speed-up for membership testing by 
handling the most common case first (the case 
where the element is hashable).

Closes SF Patch 597444.


Index: sets.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/sets.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** sets.py	20 Aug 2002 23:34:01 -0000	1.6
--- sets.py	21 Aug 2002 01:35:29 -0000	1.7
***************
*** 228,237 ****
          """
          try:
!             transform = element._as_temporarily_immutable
!         except AttributeError:
!             pass
!         else:
!             element = transform()
!         return element in self._data
  
      # Subset and superset test
--- 228,237 ----
          """
          try:
!             return element in self._data
!         except TypeError:
!             transform = getattr(element, "_as_temporary_immutable", None)
!             if transform is None:
!                 raise # re-raise the TypeError exception we caught
!             return transform() in self._data
  
      # Subset and superset test
***************
*** 370,381 ****
          data = self._data
          value = True
!         for elt in iterable:
              try:
!                 transform = elt._as_immutable
!             except AttributeError:
!                 pass
!             else:
!                 elt = transform()
!             data[elt] = value
  
      def clear(self):
--- 370,381 ----
          data = self._data
          value = True
!         for element in iterable:
              try:
!                 data[element] = value
!             except TypeError:
!                 transform = getattr(element, "_as_temporary_immutable", None)
!                 if transform is None:
!                     raise # re-raise the TypeError exception we caught
!                 data[transform()] = value
  
      def clear(self):
***************
*** 391,400 ****
          """
          try:
!             transform = element._as_immutable
!         except AttributeError:
!             pass
!         else:
!             element = transform()
!         self._data[element] = True
  
      def remove(self, element):
--- 391,400 ----
          """
          try:
!             self._data[element] = True
!         except TypeError:
!             transform = getattr(element, "_as_temporary_immutable", None)
!             if transform is None:
!                 raise # re-raise the TypeError exception we caught
!             self._data[transform()] = True
  
      def remove(self, element):
***************
*** 404,413 ****
          """
          try:
!             transform = element._as_temporarily_immutable
!         except AttributeError:
!             pass
!         else:
!             element = transform()
!         del self._data[element]
  
      def discard(self, element):
--- 404,413 ----
          """
          try:
!             del self._data[element]
!         except TypeError:
!             transform = getattr(element, "_as_temporary_immutable", None)
!             if transform is None:
!                 raise # re-raise the TypeError exception we caught
!             del self._data[transform()]
  
      def discard(self, element):