17 December 2008 · 1 min
In my post Computing argmax fast in Python, I reported that Python has no builtin function to compute argmax, the position of a maximal value. I provided one such function and asked people to improve my solution. Here are the results:
| argmax function | running time |
| array.index(max(array)) | 0.1 s |
| max(izip(array, xrange(len(array))))[1] | 0.2 s |
Conclusion: array.index(max(array)) is simpler and faster.
Update: Please see The language interpreters are the new machines.
Daniel Lemire, "Fast argmax in Python," in Daniel Lemire's blog, December 17, 2008, https://lemire.me/blog/2008/12/17/fast-argmax-in-python/.
[BibTeX]
Complexity of these operations with regard to array length would be more interesting. I think that your conclusion is a bit too wide.
They all have linear complexity.
Interesting!
The first solution is amazing!
What about:
max(range(len(array)), key=lambda x: array[x])
Slower than
a.index(max(a)). (Tested by ipython%timeit)def argmax(a_list,key=lambda x:x):
index = 0
maxval = key(a_list[0])
for i,e in enumerate(a_list[1:],1):
v = key(e)
if v > maxval:
index = i
maxval = v
return index
def argmax2(a_list,key=lambda x:x):
index, value = max(enumerate(a_list), key=lambda y:key(y[1]))
return index
I’m sorry that the previous comment was malformatted.
def argmax(a_list,key=lambda x:x):
index = 0
maxval = key(a_list[0])
for i,e in enumerate(a_list[1:],1):
v = key(e)
if v > maxval:
index = i
maxval = v
return index
def argmax2(a_list,key=lambda x:x):
index, value = max(enumerate(a_list), key=lambda y:key(y[1]))
return index