map-like function on dict values?
Huaiyu Zhu
huaiyu at gauss.almadan.ibm.com
Tue Mar 5 14:16:33 EST 2002
On Sat, 2 Mar 2002 03:46:52 -0500, Raymond Hettinger <python at rcn.com> wrote:
>
>def tunedmap(f, d):
> return map( d.__setitem__, d.keys(), map(f, d.values()) )
>
Yes, that's a good point.
Since there are so many variations on this theme, I decided to do it
thoroughly last weekend. It turns out that the most traditional approach
(iterkv) is the odd one out - It is many times slower than the rest, which
are all similar. Why?
#!/usr/bin/env python
from time import clock
def emptyloop(f, d):
for i in xrange(len(d)): pass
def emptyloopcall(f, d):
for i in xrange(len(d)): f(None)
def iter(f, d):
for k in d: d[k] = f(d[k])
def iterk(f, d):
for k in d.keys(): d[k] = f(d[k])
def iterik(f, d):
for k in d.iterkeys(): d[k] = f(d[k])
def iterkv(f, d):
for k, v in d.items(): d[k] = f(v)
def iterikv(f, d):
for k, v in d.iteritems(): d[k] = f(v)
def mapv(f, d): map(d.__setitem__, d, map(f, d.values()))
def mapiv(f, d): map(d.__setitem__, d, map(f, d.itervalues()))
def mapkv(f, d): map(d.__setitem__, d.keys(), map(f, d.values()))
def mapkiv(f, d): map(d.__setitem__, d.keys(), map(f, d.itervalues()))
def mapikv(f, d): map(d.__setitem__, d.iterkeys(), map(f, d.values()))
def mapikiv(f, d): map(d.__setitem__, d.iterkeys(), map(f, d.itervalues()))
def timeit(test, f, d):
_time = clock()
test(f, d)
print test.__name__, clock() - _time
if __name__ == '__main__':
def f(x): pass
d = {}
for i in xrange(1000000): d[i] = None
timeit(emptyloop, f, d)
timeit(emptyloopcall, f, d)
timeit(iterik, f, d)
timeit(iter, f, d)
timeit(iterikv, f, d)
timeit(iterk, f, d)
timeit(mapikv, f, d)
timeit(mapv, f, d)
timeit(mapkv, f, d)
timeit(mapikiv, f, d)
timeit(mapiv, f, d)
timeit(mapkiv, f, d)
timeit(iterkv, f, d)
"""
Output
emptyloop 0.83
emptyloopcall 2.81
iterik 3.58
iter 3.62
iterikv 3.72
iterk 3.92
mapikv 4.63
mapv 4.64
mapkv 4.93
mapikiv 5.68
mapiv 5.76
mapkiv 5.91
iterkv 25.57
"""
More information about the Python-list
mailing list