SF patch #678899:  Save time and memory by using itertools in sets module.
diff --git a/Lib/sets.py b/Lib/sets.py
index 6d2c032..5a0167d 100644
--- a/Lib/sets.py
+++ b/Lib/sets.py
@@ -57,7 +57,7 @@
 
 
 __all__ = ['BaseSet', 'Set', 'ImmutableSet']
-
+from itertools import ifilter
 
 class BaseSet(object):
     """Common base class for mutable and immutable sets."""
@@ -182,7 +182,7 @@
             little, big = self, other
         else:
             little, big = other, self
-        common = filter(big._data.has_key, little._data)
+        common = ifilter(big._data.has_key, little)
         return self.__class__(common)
 
     def intersection(self, other):
@@ -204,12 +204,10 @@
         value = True
         selfdata = self._data
         otherdata = other._data
-        for elt in selfdata:
-            if elt not in otherdata:
-                data[elt] = value
-        for elt in otherdata:
-            if elt not in selfdata:
-                data[elt] = value
+        for elt in ifilter(otherdata.has_key, selfdata, True):
+            data[elt] = value
+        for elt in ifilter(selfdata.has_key, otherdata, True):
+            data[elt] = value
         return result
 
     def symmetric_difference(self, other):
@@ -228,11 +226,9 @@
             return NotImplemented
         result = self.__class__()
         data = result._data
-        otherdata = other._data
         value = True
-        for elt in self:
-            if elt not in otherdata:
-                data[elt] = value
+        for elt in ifilter(other._data.has_key, self, True):
+            data[elt] = value
         return result
 
     def difference(self, other):
@@ -264,10 +260,8 @@
         self._binary_sanity_check(other)
         if len(self) > len(other):  # Fast check for obvious cases
             return False
-        otherdata = other._data
-        for elt in self:
-            if elt not in otherdata:
-                return False
+        for elt in ifilter(other._data.has_key, self, True):
+            return False
         return True
 
     def issuperset(self, other):
@@ -275,9 +269,7 @@
         self._binary_sanity_check(other)
         if len(self) < len(other):  # Fast check for obvious cases
             return False
-        selfdata = self._data
-        for elt in other:
-            if elt not in selfdata:
+        for elt in ifilter(self._data.has_key, other, True):
                 return False
         return True