我使用的python 3.6使用TKinter文本控件来标记一些元数据的每个字。我发现,一旦我有超过800字,程序开始运行非常缓慢,在3200这几乎是无响应。我想知道是否有办法来优化我的代码,因此它可以处理更多的标签的话吗?或提供微件访问更多的内存,如果这将有助于。
下面是我的程序的一个非常简化的版本:
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
def createWidgets(root):
textcanvas = ScrolledText(root, insertofftime=0)
textcanvas.pack()
populate(textcanvas)
return textcanvas
def populate(textcanvas):
for i in range(5000):
textcanvas.insert(tk.END, "word ", "TAG:>{:d}".format(i))
if __name__ == '__main__':
root =tk.Tk()
createWidgets(root)
root.mainloop()
一般来说,文本组件应该能够处理成千上万个标签没有太多的性能命中。但是,也有数据的某些特性,可以影响这一点。
根据你的榜样,你的数据有,这将导致性能不佳的特征之一:要插入25000个字符5000个标签,都没有一个换行符。
这就是canonical text widget documentation说,关于性能方面的考虑(着重突出你可能看到的问题):
文本组件应在各种条件下高效运行。文本组件使用大约2-3个字节的文本的每个字节的主内存,所以含有兆字节以上的文字应该是最实用的工作站。文本与经修饰的B树结构,使得操作相对甚至具有大文本高效内部表示。标签都包含在B树结构的方式,让标签跨越大范围或有许多不相交的小范围没有效率的损失。标记的方式,允许大量的标记也可以实现。在大多数情况下,这是很好有大量独特的标签,或者说有很多不同范围的标签。
如果你有数百或数千个不同的标签,所有具有以下特征的可能会出现一个性能问题:每个标签的第一个和最后一个范围分别为附近文本的开头和结尾,或单个标签的范围涵盖了大部分的文本部件。添加和删除标签这样的成本正比于具有相同属性的其他标签的数量。相比之下,与如果他们的整体范围是局部的和贯穿全文均匀地分布有成千上万不同的标签没有问题。
很长的文本行可以是昂贵的,特别是如果他们有在其中许多标记和标签。
与插入光标显示线在每次光标的闪烁时间,这将导致图形一个稳定的交通流重绘。设置insertOffTime属性为0,避免这种情况。