Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Problema agregando enormes cantidad de items a un ListCtrl en wxPython

Estas en el tema de Problema agregando enormes cantidad de items a un ListCtrl en wxPython en el foro de Python en Foros del Web. Mi problema es el siguiente.: Al intentar agregar una enorme cantidad de items a un ListCtrl , este dura mucho tiempo. Tal vez me dirán ...
  #1 (permalink)  
Antiguo 07/11/2011, 08:16
Avatar de wilmermorel  
Fecha de Ingreso: agosto-2011
Ubicación: Santo Domingo
Mensajes: 30
Antigüedad: 12 años, 8 meses
Puntos: 2
Pregunta Problema agregando enormes cantidad de items a un ListCtrl en wxPython

Mi problema es el siguiente.: Al intentar agregar una enorme cantidad de items a un ListCtrl, este dura mucho tiempo. Tal vez me dirán que es lógico, pues el bucle for tendrá igual numero de iteraciones que los items en la lista y por consiguiente el tiempo sera proporcionalmente.... eso lo había comprendido y aceptado resignandome a ese problema, hasta que, no recientemente, instale MySQL Quety Browser para hacer las consultas a MySQL desde una interfaz gráfica. Este programa muestra las tablas en un ListCtrl de igual manera que la muestra mi programa, a excepción de que el tiempo es increíblemente menor, aproximadamente menos de 2 segundos en hacer la consulta y agregar los items a su lista, sin embargo mi código dura mas de 40 segundos en hacer lo mismo.

"La tabla consta de 20,000 items|filas"

Intente usando Thread, pero en realidad no me interesan ya. ya que aunque este trabajando en segundo plano, el tiempo es el mismo.
He probado usando el método Append, para agregar los items al ListCtrl, pero es lo mismo.
Le quite el código para asignarle imágenes, pero igual.

No creo que el problema sea por que python es de alto nivel, por que creo que aun MySQL Browser este escrito en C, la diferencia de 2 a 40seg es mucha (pienso).


La lista de articulos obtenida de la base de datos, es algo parecido a esto:
((ref, clase, marca, atributos, cant, precio, costo, fecha), (ref, clase, marca,....)....(n))

el codigo de la funcion es este:

Código Python:
Ver original
  1. def AddListaInventario(self, articulos):
  2.         """Agregar los articulos a la lista de inventario"""
  3.        
  4.         #eliminar los items anteriores
  5.         self.list_ctrl_inventario.DeleteAllItems()
  6.        
  7.         #asignar las imagenes
  8.         imagenes = [self.GetGrafico("articulo_20"),
  9.         self.GetGrafico("articulo2_20")]
  10.         li = wx.ImageList(20,20, True)
  11.         for bmp in imagenes:
  12.             num_icn = li.Add(bmp)
  13.         self.list_ctrl_inventario.AssignImageList(li,wx.IMAGE_LIST_SMALL)
  14.  
  15.         #agregar los items
  16.         for fila in articulos:
  17.             if fila[4] == 0:
  18.                 img = 1 % (num_icn+1)
  19.             else:
  20.                 img = 0 % (num_icn+1)
  21.            
  22.             index = self.list_ctrl_inventario.InsertStringItem(sys.maxint,
  23.             fila[0], img)
  24.             self.list_ctrl_inventario.SetStringItem(index, 1, fila[1])
  25.             self.list_ctrl_inventario.SetStringItem(index, 2, fila[2])
  26.             self.list_ctrl_inventario.SetStringItem(index, 3, fila[3])
  27.             self.list_ctrl_inventario.SetStringItem(index, 4, str(fila[4]))
  28.            
  29.             self.list_ctrl_inventario.SetStringItem(index, 5,
  30.             str(locale.currency(fila[5], grouping=True)))
  31.            
  32.             self.list_ctrl_inventario.SetStringItem(index, 6,
  33.             str(locale.currency(fila[6], grouping=True)))
  34.            
  35.             self.list_ctrl_inventario.SetStringItem(index, 7, fila[7])

Última edición por razpeitia; 07/11/2011 a las 09:24 Razón: He medido el tiempo que dura.. 40seg. Resaltado de sintaxis
  #2 (permalink)  
Antiguo 07/11/2011, 09:58
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Problema agregando enormes cantidad de items a un ListCtrl en wxPython

Tienes que usar virtual list.

Aquí un ejemplo de como funcionan.

Si quieres probarlo para 20,000 items entonces copia y pega este código justo debajo del diccionario musicdata.
Código Python:
Ver original
  1. n = 20000
  2. l = musicdata.values()
  3. L = {}
  4. for i in xrange(n):
  5.     L[i] = l[i % len(l)]
  6. musicdata = L

Etiquetas: bucles, items, listas, listctrl, wxpython, bases-de-datos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:01.