diff options
author | Raymond Hettinger <python@rcn.com> | 2003-02-02 14:27:19 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2003-02-02 14:27:19 (GMT) |
commit | a3a53180c0325e85211154ae600240cb3519bada (patch) | |
tree | 7a682e50af7ffecb9b678cb385eb89150b6e1747 /Lib/sets.py | |
parent | efb9625b81c87330742e49b1df9595634583f7a8 (diff) | |
download | cpython-a3a53180c0325e85211154ae600240cb3519bada.zip cpython-a3a53180c0325e85211154ae600240cb3519bada.tar.gz cpython-a3a53180c0325e85211154ae600240cb3519bada.tar.bz2 |
SF patch #678899: Save time and memory by using itertools in sets module.
Diffstat (limited to 'Lib/sets.py')
-rw-r--r-- | Lib/sets.py | 30 |
1 files changed, 11 insertions, 19 deletions
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 @@ what's tested is actually `z in y'. __all__ = ['BaseSet', 'Set', 'ImmutableSet'] - +from itertools import ifilter class BaseSet(object): """Common base class for mutable and immutable sets.""" @@ -182,7 +182,7 @@ class BaseSet(object): 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 @@ class BaseSet(object): 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 @@ class BaseSet(object): 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 @@ class BaseSet(object): 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 @@ class BaseSet(object): 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 |