Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/11/2011, 08:16
Avatar de wilmermorel
wilmermorel
 
Fecha de Ingreso: agosto-2011
Ubicación: Santo Domingo
Mensajes: 30
Antigüedad: 13 años, 4 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