[pyar] Eiliminando if .. else

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


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/ca356581/attachment-0001.html>


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