[Python] - Matrices.

Iniciado por Meta, 14 Noviembre 2010, 06:24 AM

0 Miembros y 2 Visitantes están viendo este tema.

Novlucker

De hecho no, es que en mi caso no uso append para generar la lista, sino que la genero dinamicamnte con un for.

El primer for genera una lista de n elementos, y el for de afuera crea n listas (matriz n x n). La diagonal la defino con esa única comparación i==e :D

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Meta

Que interés, que fuerza, que motivación, que ilusión, que grandeza, qué ánimos, qué energía...
veo mucha profesionalidad aquí dentro.

¿Se puede hacer sencillo de entender?

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Karcrack

Cita de: Novlucker en 16 Noviembre 2010, 17:23 PM
De hecho no, es que en mi caso no uso append para generar la lista, sino que la genero dinamicamnte con un for.

El primer for genera una lista de n elementos, y el for de afuera crea n listas (matriz n x n). La diagonal la defino con esa única comparación i==e :D

Saludos
Entonces si que se hacen dos for, no? :xD

Novlucker

#13
Ya ya, pero a lo que voy es que no son más vueltas :xD y lo de la diagonal es la comparación :P
[Edito]:
Ahora si por si acaso, medido el tiempo con timeit para n = 10 y 1000 repeticiones de la función (obviamente he quitado el input)

Karcrack = 23.4203746812
Novlucker = 6.43258395027 :D

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Karcrack

Novlucker, podrais postear exactamente el codigo que has utilizado para medir el tiempo con timeit? asi puedo mejorar mis marcas :D

Novlucker

Este ...
Código (python) [Seleccionar]
import timeit
def test():
   n = 10
   M = []
   for i in range(n):
       a = [0] * n
       a[i] = 1
       print a
       M.append(a)

if __name__=='__main__':
   from timeit import Timer
   t = Timer("test()", "from __main__ import test")
   print t.timeit(1000)


... pero, le he quitado los comentarios y ha bajado 8 segundos? :huh: Igual ahora lo repetí 4 veces y da 16/17.

Ahí lo único que haces es cambiar lo que está en la función test, que para el caso de mi código no es más que poner las líneas de la creación de la lista M y el print :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Karcrack

#16
Pues te gano yo quitando los prints :P
Código (python) [Seleccionar]
import timeit
def test1():
   n = 10
   M = [[int(i==e) for i in range(n)] for e in range(n)]
def test2():
   n = 10
   M = []
   for i in range(n):
       a = [0] * n
       a[i] = 1
       M.append(a)
       
if __name__=='__main__':
   from timeit import Timer
   t = Timer("test1()", "from __main__ import test1")
   print t.timeit(10000), "->Novlucker"
   t = Timer("test2()", "from __main__ import test2")
   print t.timeit(10000), "->Karcrack"

Tienes que tener en cuenta que yo llamo a print() n veces, y tu solo una... :P

Lo he ejecutado 10 veces y mira los resultados:
1.05840686456 ->Novlucker
0.208165562942 ->Karcrack
1.00837229313 ->Novlucker
0.21114219824 ->Karcrack
0.989414576434 ->Novlucker
0.205958299169 ->Karcrack
0.987928354023 ->Novlucker
0.208567848707 ->Karcrack
0.993568176961 ->Novlucker
0.210146820336 ->Karcrack
0.980355603855 ->Novlucker
0.204104990997 ->Karcrack
0.984192963072 ->Novlucker
0.205497626095 ->Karcrack
0.981901331035 ->Novlucker
0.203624203635 ->Karcrack
0.982219807266 ->Novlucker
0.2067748834 ->Karcrack
0.98221617552 ->Novlucker
0.283576264581 ->Karcrack

Mi codigo es aproximadamente 5 veces mas rapido :D



MOD: He hecho una version ligeramente mas rapida :)
Código (python) [Seleccionar]
    n = 10
    M = [[0]*n for i in range(n)]
    while n:
        n-=1
        M[n][n] = 1

Novlucker

Pues si :P
Supongo que pesa la comparación que hago para determinar la diagonal, y que tu clonas la lista y yo la genero :P
Es decir, tu creas la lista con valores por defecto y la modificas, yo hago las verificaciones antes de crearla, pero obviamente termina siendo más ligero :xD

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein