[pyar] Eiliminando if .. else

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


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/92a6bd7d/attachment.html>


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