[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