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