Operaciones sobre matrices

nocreyente nocreyentes en terra.es
Sab Abr 1 22:43:31 CEST 2006


He ejecutado el test en mi maquina y estos has sido mis resultados:
F1: 0.2948
F2: 0.3213
F3: 0.1064

F3 suponia que iba a ser ligeramente más rápido, pero no tanto. Con  
estas diferencias, me replantearía si conviene o no aprender "trucos"  
como el de la operacion ternaria aunque sea más dificil de leer en un  
principio.

Que el F2 tardara más que el F1, me extraño al principio. Asi que he  
googleado un poco para encontrar un tutorial de optimización en  
python que lei hace un tiempo, y es donde me inspire para quitar el if:

http://trific.ath.cx/resources/python/optimization/

Aunque releyendolo:
------- Inicio cita
Exceptions shouldn't happen

At least in Python. Don't confuse exceptions with if-then.

Let's say we need reciprocal value and want to set the result to None  
if we would have to divide by zero. So, we have two possibilities.  
Exception:

try:
     y = 1.0/x
except ZeroDivisionError:
     y = None

And classic if-then:

if x == 0:
     y = None
else:
     y = 1.0/x

Which one is faster depends on how often x is zero. If never, then  
exception is about twice faster. If always, if-then is at least 20×  
faster.
----------- Fin cita

Parece que el cero se produce las suficientes veces como para que F1  
sea mejor que F2.

Muchas gracias por tu codigo y un saludo:

Javi


El 01/04/2006, a las 21:12, Lionel Iturri escribió:

> camontuyu wrote:
>
>> El sáb, 01-04-2006 a las 13:34 +0200, nocreyente escribió:
>>
>>
>>
>>> Opcion funcion nº2:
>>> Ya que parece que nos importa el rendimiento, queria comentar una
>>> variacion de la anterior.
>>>
>>> def inv(x):
>>> 	try:
>>> 		return 1/x
>>> 	except:
>>> 		return 1
>>>
>>> m = [[ inv(x) for x in fila] for fila in matriz]
>>>
>>> Con esta variaciacion te quitas de encima unas cuantas  
>>> comparaciones.
>>> Es legible y eficiente, me gusta.
>>>
>>>
>>>
>>
>> Sin duda esta opción, sin menospreciar al resto, es la que creo  
>> mejor,
>> pues la probabilidad de que un elemento de la matriz sea cero es muy
>> baja y por tanto, como dices, se evita hacer un montón de  
>> comparaciones.
>>
>> Muchas gracias a todos.
>>
>>
>> 		
>> ______________________________________________
>> LLama Gratis a cualquier PC del Mundo.
>> Llamadas a fijos y móviles desde 1 céntimo por minuto.
>> http://es.voice.yahoo.com
>>
>>
>> --------------------------------------------------------------------- 
>> ---
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en aditel.org
>> http://listas.aditel.org/listinfo/python-es
>>
>>
> Al principio me parecio lo mismo, pero despues de pensarlo bien  
> esta la
> sobrecarga de llamadas a funciones, velo con tus propios ojos.
>
>
> import random
> from time import time
>
> Matriz= [ [ random.random()*100 for x in xrange(100) ] for x1 in
> xrange(100) ]
>
> C1=10
> C2=10
>
> def inv1(x):
>    if x:
>       return 1/x
>    else:
>       return 1
>
> def F1():
>    for t in xrange(C1):
>       m = [[ inv1(x) for x in fila] for fila in Matriz]
>
> def inv2(x):
>    try:
>       return 1/x
>    except:
>       return 1
>
> def F2():
>    for t in xrange(C1):
>       m = [ [ inv2(x) for x in fila ] for fila in Matriz]
>
>
> def F3():
>    for t in xrange(C1):
>       m = [ [ x and x or 1 for x in fila ] for fila in Matriz]
>
>
> for Func in (F1, F2, F3):
>    Ts=[]
>    for C in xrange(C2):
>       T=time()
>       Func()
>       Ts.append( time() - T )
>    print "%s: %.4f" % (Func.__name__, reduce(lambda x, y: x+y, Ts) /
> len(Ts))
>
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es




Más información sobre la lista de distribución Python-es