如何更改我的QListWidget实现以提高性能?

时间:2016-01-27 22:10:55

标签: performance qt pyqt

可以理解,下面的代码显示QList.addItems调用需要0.393秒。我在一个更大的程序中使用类似的代码 - 这个想法是为用户提供一个(非常)大的唯一部件号列表。他们开始在单独的QEntry小部件中输入正则表达式,该小部件实时更新QList,随着时间的推移将列表缩短和缩短。

我遇到的问题是,如果用这么大的列表,当用户输入正则表达式时,需要花费相当多的时间来更新QList视图。我不认为这是一个独特的问题 - 这个问题的常见解决方案是什么?如何以合理的方式截断我的列表,以免对用户体验产生显着的负面影响? QListView是更好的选择吗?将列表缩短到100个左右的项目是否有意义,并在用户滚动时实时加载更多项目?或者这种方法有陷阱吗?

import time
from itertools import cycle
from PyQt4 import QtCore, QtGui

pns = cycle(['ABCD', 'EFGH', 'IJKL', 'MNOP'])

pn_col = []
for i in range(505000):
    pn_col.append("{}_{}".format(next(pns), i))

app = QtGui.QApplication([])
myList = QtGui.QListWidget()
start = time.clock()
myList.addItems(pn_col)
print("Time = {}".format(time.clock() - start))

更新:事实证明我的列表实际上是大约4000个唯一值,重复总计500k。卫生署!删除重复项修复了我的性能问题。不过,我仍然有兴趣了解科学和其他方面,列出这些数据的更有效方法。它是一个真正的平面列表,我不能轻易地对它们进行分组或层次结构。

1 个答案:

答案 0 :(得分:2)

QListWidget是小型列表的便捷窗口小部件。要拥有真实的列表,您应该QListViewQAbstractListModel相关联,然后重新实现。

在您的示例中,列表长度为500k项!如何使用真正的数据库来处理它?使用Qt,您可以QSqlTableModelSQLite相关联,请参阅doc here。排序和搜索将在SQL中完成,结果将传播到模型。

注意:如果你使用python 2.7,用range()替换xrange(),它一次返回一个值,而不是在内存中构造500k元素的整个列表。