[pyar] Eiliminando if .. else

Luis Andraschnik luis.andraschnik en gmail.com
Jue Feb 22 15:41:20 -03 2018


No tan salame ..., ahora corregido

$ python prueba_time.py
1.000728495811149
0.9787151040460681
1.0320799457120522
0.9991623982821556
0.9907039321706911
1.005460750853243
1.0010734098825957
0.9823332279481489
0.9730712587521576
1.0037417856920754

from timeit import timeit

slow="""
def slow(a, b):
    temp = np.inf if b == 0 else a/b
    if temp < 0.1:
        result = r1
    elif 0.1 <= temp < 1.0:
            result = r2
    elif 1.0 <= temp < 3.0:
        result = r3
    else:
        result = r4
    return result
"""

fast="""
def fast(a, b):
    print(a,b)
    if not b:
        return r4
    if a > 3 * b:
        return r4
    if a >= b:
        return r3
    if a < 0.1 * b:
        return r1
    return r2
"""

mysetup ="""
from random import randint
map_vector = r1, r2, r3, r4 = 0, 1, 1, 2
a=randint(0,1000)
b=randint(0,1000)
"""
for i in range(10):
    slow_time = fast_time = 0
    slow_time += timeit(setup=mysetup,
                        stmt=slow,
                        number=1000000)
    fast_time += timeit(setup=mysetup,
                        stmt=fast,
                        number=1000000)
    print(slow_time/fast_time)

El 22 de febrero de 2018, 15:33, Luis Andraschnik <
luis.andraschnik en gmail.com> escribió:

> Claro que salame medí la misma función!!!!!!
>
> El 22 de febrero de 2018, 15:32, Luis Andraschnik <
> luis.andraschnik en gmail.com> escribió:
>
>> No parece haber diferenic entre multiplicar y dividir:
>>
>> from timeit import timeit
>>
>> slow="""
>> def slow(a, b):
>>     if not b:
>>         return r4
>>     if a > 3 * b:
>>         return r4
>>     if a >= b:
>>         return r3
>>     if a < 0.1 * b:
>>         return r1
>>     return r2
>> """
>>
>> fast="""
>> def fast(a, b):
>>     print(a,b)
>>     if not b:
>>         return r4
>>     if a > 3 * b:
>>         return r4
>>     if a >= b:
>>         return r3
>>     if a < 0.1 * b:
>>         return r1
>>     return r2
>> """
>>
>> mysetup ="""
>>
>> from random import randint
>> map_vector = r1, r2, r3, r4 = 0, 1, 1, 2
>> a=randint(0,1000)
>> b=randint(0,1000)
>> """
>> for i in range(10):
>>     slow_time = fast_time = 0
>>     slow_time += timeit(setup=mysetup,
>>                         stmt=slow,
>>                         number=1000000)
>>     fast_time += timeit(setup=mysetup,
>>                         stmt=fast,
>>                         number=1000000)
>>     print(slow_time/fast_time)
>>
>> $ python prueba_time.py
>> 0.9917705698482823
>> 1.0121244562703653
>> 0.9688908392537829
>> 1.0114443710113799
>> 1.0165933513801737
>> 1.0086738187628372
>> 1.0079900517792493
>> 1.0120018098377634
>> 0.9991501082843947
>> 1.0135412562470205
>>
>>
>>
>>
>>
>> El 22 de febrero de 2018, 13:39, Martin Alejandro Castro Álvarez <
>> martincastro.10.5 en gmail.com> escribió:
>>
>>> Y esta es una solución un poco mas limpia con la misma idea de
>>> multiplicar y no dividir, pero que falla únicamente cuando a/b=3 (que
>>> solucioné creando un intervalo desde 3.00001). El beneficio es que podés
>>> agregarle más intervalos.
>>>
>>> INTERVALS = ((3.000001, 2), (1, 1), (0.1, 1), (0, 0))
>>>
>>> def scalable(a, b):
>>>     for i in INTERVALS:
>>>         if a >= i[0] * b:
>>>             return i[1]
>>>     return 0
>>>
>>>
>>> 2018-02-22 13:29 GMT-03:00 Martin Alejandro Castro Álvarez <
>>> martincastro.10.5 en gmail.com>:
>>>
>>>> Multiplicar lo hace muchas veces más rápido que dividir:
>>>>
>>>> def fast(a, b):
>>>>     if not b:
>>>>         return r4
>>>>     if a > 3 * b:
>>>>         return r4
>>>>     if a >= b:
>>>>         return r3
>>>>     if a < 0.1 * b:
>>>>         return r1
>>>>     return r2
>>>>
>>>>
>>>> 2018-02-22 12:01 GMT-03:00 Luis Andraschnik <luis.andraschnik en gmail.com
>>>> >:
>>>>
>>>>> Hola Lucio
>>>>> Esta es más complicada, lo tengo que tomar con dos vasos de agua :)
>>>>> Saludos!
>>>>> Luis
>>>>>
>>>>>
>>>>> El 22 de febrero de 2018, 11:33, Lucio <lucionardelli en gmail.com>
>>>>> escribió:
>>>>>
>>>>>> Bunas,
>>>>>>
>>>>>> Muy buena la de *bisect*! No la tenía, te queda mucho más lindo!
>>>>>>
>>>>>> Yo lo resolví utilizando *groupby*. De todas maneras lo comparto
>>>>>> porque me parece interesante para responder la pregunta original de como
>>>>>> evitar los *else if*.
>>>>>> Lo que hice es sencillo, los límites están ordenados por lo que
>>>>>> siempre podés ir "buscando" el "*menor de los mayores"* :
>>>>>>
>>>>>> import numpy as npfrom itertools import groupby
>>>>>>> #map_vector acetileno/etileno
>>>>>>> ACETILENO_ETILENO_MV = {0.1: 0,
>>>>>>>         1.0: 1,
>>>>>>>         3.0: 1,
>>>>>>>         np.inf: 4}
>>>>>>> def classify(value, map_vector):
>>>>>>>     for limit in sorted(map_vector.keys()):
>>>>>>>         if value < limit:
>>>>>>>             return map_vector[limit]
>>>>>>>     else:
>>>>>>>         return map_vector[np.inf]
>>>>>>> def gas_a_div_gas_b(a, b):
>>>>>>>     temp =  np.inf if b == 0 else a/b
>>>>>>>     return classify(temp, ACETILENO_ETILENO_MV)
>>>>>>>
>>>>>>>
>>>>>> Saludos!
>>>>>>
>>>>>> El 22 de febrero de 2018, 11:14, Facundo Batista <
>>>>>> facundobatista en gmail.com> escribió:
>>>>>>
>>>>>>> El 22 de febrero de 2018, 10:59, Luis Andraschnik
>>>>>>> <luis.andraschnik en gmail.com> escribió:
>>>>>>>
>>>>>>> >     if temp < 0.1:
>>>>>>> >         result = r1
>>>>>>> >     elif 0.1 <= temp < 1.0:
>>>>>>> >             result = r2
>>>>>>> >     elif 1.0 <= temp <= 3.0:
>>>>>>> >         result = r3
>>>>>>> >     else:
>>>>>>> >         result = r4
>>>>>>> >     return result
>>>>>>>
>>>>>>> Mirá el primer ejemplo acá:
>>>>>>> https://docs.python.org/3/library/bisect.html#other-examples
>>>>>>>
>>>>>>> Si no te sale, lo vemos.
>>>>>>>
>>>>>>> Saludos,
>>>>>>>
>>>>>>> --
>>>>>>> .    Facundo
>>>>>>>
>>>>>>> Blog: http://www.taniquetil.com.ar/plog/
>>>>>>> PyAr: http://www.python.org/ar/
>>>>>>> Twitter: @facundobatista
>>>>>>> _______________________________________________
>>>>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>>>>> Sitio web: http://www.python.org.ar/
>>>>>>>
>>>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>>
>>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre
>>>>>>> de Argentina - http://www.usla.org.ar
>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>>>> Sitio web: http://www.python.org.ar/
>>>>>>
>>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>>
>>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre
>>>>>> de Argentina - http://www.usla.org.ar
>>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>>> Sitio web: http://www.python.org.ar/
>>>>>
>>>>> Para administrar la lista (o desuscribirse) entrar a
>>>>> http://listas.python.org.ar/listinfo/pyar
>>>>>
>>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>>>> Argentina - http://www.usla.org.ar
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>>
>>>> *Martín Alejandro Castro Álvarez*
>>>> Software Solutions
>>>> *https://www.martincastroalvarez.com
>>>> <https://www.martincastroalvarez.com>*
>>>>
>>>>
>>>
>>>
>>> --
>>>
>>> *Martín Alejandro Castro Álvarez*
>>> Software Solutions
>>> *https://www.martincastroalvarez.com
>>> <https://www.martincastroalvarez.com>*
>>>
>>>
>>> _______________________________________________
>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>> Sitio web: http://www.python.org.ar/
>>>
>>> Para administrar la lista (o desuscribirse) entrar a
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>> Argentina - http://www.usla.org.ar
>>>
>>
>>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20180222/098a332a/attachment-0001.html>


Más información sobre la lista de distribución pyar