Найти - Пользователи
Полная версия: Ускорение вывода на экран
Начало » Python для новичков » Ускорение вывода на экран
1
.pyw
Добрый день. Не могли бы вы меня направить в нужную сторону?)
Собственно понадобилось мне создать дерево(wx.tree) из моего файла(от 60000 записей). Собственно на импорт и первоначальную обработку записей уходит достаточно маленькое время. А вот на создание самого дерева очень много.

Для создания дерева был взят код из темы “Помогите с заполнением wx.TreeCtrl из SQL” (http://python.su/forum/viewtopic.php?id=5459)

#######################################################
import wx

class TestFrame(wx.Frame):

def __init__(self):
wx.Frame.__init__(self, None, -1, “Test”, size=(300, 300))
self.tree = wx.TreeCtrl(self)
_Tree = [,,,
,,]

def branch(node, id):
for x in filter(lambda x: x == id, _Tree):
if node:
new_node = self.tree.AppendItem(node, x)
else:
new_node = self.tree.AddRoot(x)
self.tree.SetPyData(new_node, x)
branch(new_node, x)

self.tree.Freeze()
branch(None, 0)
self.tree.Thaw()

if __name__ == ‘__main__’:
app = wx.PySimpleApp()
frame = TestFrame()
frame.Show(True)
app.MainLoop()

#######################################################

После некоторого раздумья, так как программа для формирования дерева из 18000 записей дерево делала за 83 секунды, а из 60000 записей ну вообще много времени))) было принято решение доработать для того чтобы она не проходила одно место 2 раза. Собственно я отсортировал список и переписал немного

#######################################################
class TestFrame(wx.Frame):

def __init__(self):
wx.Frame.__init__(self, None, -1, “Test”, size=(300, 300))
self.tree = wx.TreeCtrl(self)
_Tree = p


def branch(node, id):
a, i = , 0
while i < len(_Tree):
if _Tree == id:
a.append(_Tree)
del _Tree
i-=1
elif a: break
i+=1

for x in a:
if node:
new_node = self.tree.AppendItem(node, x)
else:
new_node = self.tree.AddRoot(x)
#print x
self.tree.SetPyData(new_node, x)
branch(new_node, x)
self.tree.Freeze()
branch(None, 0)
self.tree.Thaw()

if __name__ == ‘__main__’:
app = wx.PySimpleApp()
frame = TestFrame()
frame.Show(True)
app.MainLoop()
#######################################################

теперь она выполнялась за 48 секунд для 18000, но это тоже многовато будет… Подскажите какой нибудь другой подход или как её ещё убыстрить?
doza_and
Один из стандертных способов - строить виртуальное дерево - отображается только то что нужно в текущий момоент.
class TEdTree(wx.lib.mixins.treemixin.VirtualTree,wx.gizmos.TreeListCtrl,listctrl.ListCtrlAutoWidthMixin):
def __init__(self,parent,obj):
super(TEdTree,self).__init__(parent, style =
wx.TR_DEFAULT_STYLE
| wx.TR_FULL_ROW_HIGHLIGHT
| wx.TR_COLUMN_LINES
)
listctrl.ListCtrlAutoWidthMixin.__init__(self)
self.panel=parent
self.AddColumn("...")
self.AddColumn(u"значение")
self.AddColumn(u"тип")
self.AddColumn(u"единицы измерения")
self.AddColumn(u"описание")
self.SetMainColumn(_COL_NAME) # the one with the tree in it...
self.SetColumnWidth(_COL_NAME,_COL_NAME_W)
self.SetColumnWidth(_COL_VALUE,_COL_VALUE_W)
self.SetColumnWidth(_COL_TYPE,_COL_TYPE_W)
self.SetColumnWidth(_COL_UNITS,_COL_UNITS_W)
self.SetColumnWidth(_COL_DSK, _COL_DSK_W)


def OnGetItemText(self, indexes,col=0):
info=self.ObjInfoR(indexes)

if col == _COL_NAME:
return info.name
elif col== _COL_VALUE:
return str(info.obj)
elif col== _COL_TYPE:
return info.typ
elif col== _COL_DSK:
return info.dsk if info.dsk else ""
elif col== _COL_UNITS:
return info.units if info.units else ""


def OnGetChildrenCount(self, indexes):
return 4
Это правда несколько более сложный объект.
Еще быстрее будет работать VirtualListView (),
У нас древовидная структура с миллионами объектов отображалась за доли секунды…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB