[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