Skip to content

Commit 1b23ada

Browse files
authored
Merge pull request #425 from groutr/faster-dissoc
Faster dissoc
2 parents 020161b + f058785 commit 1b23ada

File tree

3 files changed

+21
-12
lines changed

3 files changed

+21
-12
lines changed

toolz/curried/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
assoc_in = toolz.curry(toolz.assoc_in)
6262
cons = toolz.curry(toolz.cons)
6363
countby = toolz.curry(toolz.countby)
64+
dissoc = toolz.curry(toolz.dissoc)
6465
do = toolz.curry(toolz.do)
6566
drop = toolz.curry(toolz.drop)
6667
excepts = toolz.curry(toolz.excepts)

toolz/dicttoolz.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import copy
21
import operator
32
from toolz.compatibility import (map, zip, iteritems, iterkeys, itervalues,
43
reduce)
@@ -197,7 +196,7 @@ def assoc(d, key, value, factory=dict):
197196
return d2
198197

199198

200-
def dissoc(d, *keys):
199+
def dissoc(d, *keys, **kwargs):
201200
""" Return a new dict with the given key(s) removed.
202201
203202
New dict has d[key] deleted for each supplied key.
@@ -210,10 +209,19 @@ def dissoc(d, *keys):
210209
>>> dissoc({'x': 1}, 'y') # Ignores missing keys
211210
{'x': 1}
212211
"""
213-
d2 = copy.copy(d)
214-
for key in keys:
215-
if key in d2:
216-
del d2[key]
212+
factory = _get_factory(dissoc, kwargs)
213+
d2 = factory()
214+
215+
if len(keys) < len(d) * .6:
216+
d2.update(d)
217+
for key in keys:
218+
if key in d2:
219+
del d2[key]
220+
else:
221+
remaining = set(d)
222+
remaining.difference_update(keys)
223+
for k in remaining:
224+
d2[k] = d[k]
217225
return d2
218226

219227

toolz/tests/test_dicttoolz.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,16 @@ def test_assoc(self):
9090

9191
def test_dissoc(self):
9292
D, kw = self.D, self.kw
93-
assert dissoc(D({"a": 1}), "a") == D({})
94-
assert dissoc(D({"a": 1, "b": 2}), "a") == D({"b": 2})
95-
assert dissoc(D({"a": 1, "b": 2}), "b") == D({"a": 1})
96-
assert dissoc(D({"a": 1, "b": 2}), "a", "b") == D({})
97-
assert dissoc(D({"a": 1}), "a") == dissoc(dissoc(D({"a": 1}), "a"), "a")
93+
assert dissoc(D({"a": 1}), "a", **kw) == D({})
94+
assert dissoc(D({"a": 1, "b": 2}), "a", **kw) == D({"b": 2})
95+
assert dissoc(D({"a": 1, "b": 2}), "b", **kw) == D({"a": 1})
96+
assert dissoc(D({"a": 1, "b": 2}), "a", "b", **kw) == D({})
97+
assert dissoc(D({"a": 1}), "a", **kw) == dissoc(dissoc(D({"a": 1}), "a", **kw), "a", **kw)
9898

9999
# Verify immutability:
100100
d = D({'x': 1})
101101
oldd = d
102-
d2 = dissoc(d, 'x')
102+
d2 = dissoc(d, 'x', **kw)
103103
assert d is oldd
104104
assert d2 is not oldd
105105

0 commit comments

Comments
 (0)