[Python-Dev] argmax? (original) (raw)

Josiah Carlson jcarlson at uci.edu
Thu Jan 8 12:59:14 EST 2004


Miki,

That sounds quite a bit like:

from itertools import imap, izip

argmax = lambda funct, items: max(izip(imap(funct, items), items)) argmin = lambda funct, items: min(izip(imap(funct, items), items))

Which breaks ties on vals using a comparison with items (I don't know if this is desireable to you).

Running a quick test on large sequences (range(100000)) with a relatively simple function (lambda a:a*a) produces the following timings on my machine (best of 7): argmax: 5.953 seconds (with std. dev. of .01455 seconds) izipimap: 5.844 seconds (with std. dev. of .03009 seconds) zipmap: 6.407 seconds (with std. dev. of .072356 seconds)

Seems to be a small win for itertools, a close second for your original argmax, and a harrowing loss for map and zip on large sequences.

I don't know how anyone would feel about adding it to the standard library,

Do you think there is a place for an "argmax" function (which I use a lot) in the standard library?

I'm thinking in the lines of: def argmax(items, func, cmp=cmp): '''argmax(items, func) -> maxitem, maxvalue''' it = iter(items) # Initial values try: item = it.next() except StopIteration: raise ValueError("can't run over empty sequence") val = func(item) for i in it: v = func(i) if cmp(v, val) == 1: item = i val = v return item, val def argmin(items, func, cmp=cmp): '''argmin(items, func) -> minitem, minvalue''' return argmax(items, func, lambda x,y : -cmp(x,y))



More information about the Python-Dev mailing list