> On 30 Aug 2020, at 12:25, Filipp Bakanov <fil...@bakanov.su> wrote:
> 
> 
> It's expected that python single iterating would be slower than two times C 
> iterating. Nevertheless one time C iterating will be probably faster than a 
> separate min + index.
> 
> >> I think one would want argmin() and argmax() to work with general iterables
> How is it supposed to work with set or dict or other iterables without clear 
> order?
> 
> My last case was to find the min index of the array part. index_min could 
> accept the starting element index, as index does. 
> 
> a = [1, 4, 1, 2, 3]
> print(a.index_min())      # 0
> print(a.index_min(1))    # 2

Of course this could be implemented in C in python, but you are going to have to
convince the python developers that it’s important enough to want to maintain 
the
code.

Is your use of such a function so performance sensitive that you need this in C?
Have you considered writing this as a C extension for your own use?

Barry

> 
> 
> 
> On Sun, 30 Aug 2020 at 11:52, Barry Scott <ba...@barrys-emacs.org> wrote:
>> 
>> 
>>>> On 30 Aug 2020, at 09:03, Jeff Allen <ja...@farowl.co.uk> wrote:
>>>> 
>>>> On 29/08/2020 14:17, Barry Scott wrote:
>>>>>> On 29 Aug 2020, at 13:42, Filipp Bakanov <fil...@bakanov.su> wrote:
>>>>>> 
>>>>>> I'd like to propose adding argmax and argmin functions to the python 
>>>>>> list. These functions return the index of a maximum / minimum element of 
>>>>>> the list. Eg:
>>>>>> 
>>>>>> a = [1, 4, 2, 3]
>>>>>> print(a.argmax())  # 1
>>>>>> print(a.argmin())  # 0
>>>>>> 
>>>>>> It's a very popular request (based on stackoverflow 
>>>>>> https://stackoverflow.com/questions/16945518/finding-the-index-of-the-value-which-is-the-min-or-max-in-python
>>>>>>  ), and currently there is no elegant way to find it.
>>>>>> 
>>>>>> What do you think?
>>>>> 
>>>>> Just do this:
>>>>> 
>>>>> >>> a=[1,4,2,3]
>>>>> >>> min(a)
>>>>> 1
>>>>> >>> a.index(min(a))
>>>>> 0
>>>>> >>> a.index(max(a))
>>>>> 1
>>>>> 
>>>>> Barry
>>>>> 
>>>> This has the drawback of passing twice over the list. The following 
>>>> doesn't, but the complexity somewhat makes Filipp's point:
>>>> 
>>>> >>> min((e, i) for i, e in enumerate(a))[1]
>>>> 0
>>>> 
>>> That is 4x slower then my code for 1,000,000 items.
>>> 
>>> --------------- a.py --------------
>>> import sys
>>> import time
>>> import random
>>> 
>>> alg = sys.argv[1]
>>> size = int(sys.argv[2])
>>> 
>>> x = [random.randint(0, 1_000_000) for _ in range(size)]
>>> 
>>> start = time.time()
>>> 
>>> if alg == 'barry':
>>> 
>>>     m = x.index(min(x))
>>> 
>>> elif alg == 'jeff':
>>> 
>>>     m = min((e, i) for i, e in enumerate(x))[1]
>>> 
>>> end = time.time()
>>> 
>>> print( alg, end-start, (end-start)/size )
>>> -------------------------
>>> 
>>> Here is the output I got on my laptop.
>>> 
>>> barry 0.022754907608032227 2.2754907608032226e-08
>>> barry 0.03325295448303223 3.325295448303223e-08
>>> barry 0.034243106842041016 3.4243106842041016e-08
>>> barry 0.02784109115600586 2.784109115600586e-08
>>> jeff 0.13722586631774902 1.3722586631774904e-07
>>> jeff 0.1359708309173584 1.359708309173584e-07
>>> jeff 0.13658690452575684 1.3658690452575684e-07
>>> 
>>> I think one would want argmin() and argmax() to work with general 
>>> iterables, so I wonder if the stdlib would not be a better home than list 
>>> itself. I half expected it to be an itertools recipe. The advantage of a 
>>> recipe is that variations such as needing the last occurrence of the 
>>> minimum are easily accommodated.
>>> 
>> 
>> Surely its index_min() and index_max() not argmin() and argmax().
>> 
>> Barry
>> 
>> _______________________________________________
>> Python-ideas mailing list -- python-ideas@python.org
>> To unsubscribe send an email to python-ideas-le...@python.org
>> https://mail.python.org/mailman3/lists/python-ideas.python.org/
>> Message archived at 
>> https://mail.python.org/archives/list/python-ideas@python.org/message/VMSSYHAOST7K3WNHO3JOQENI6G5CXZZ5/
>> Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/5VSXEETS2VFEAQSJTWUOJQ3JO5F7YMIG/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to