可以理解,下面的代码显示 QList.addItems 调用需要 0.393 秒。我在一个更大的程序中使用类似的代码 - 这个想法是向用户呈现一个(非常)大的唯一部件号列表。他们开始在单独的 QEntry 小部件中输入正则表达式,该小部件会实时更新 QList,从而使列表变得越来越短。
我遇到的问题是,对于如此大的列表,当用户输入正则表达式时,需要花费大量时间来更新 QList View 。我不认为这是一个独特的问题 - 这个问题的常见解决方案是什么?如何以合理的方式截断我的列表,以免对用户体验造成重大负面影响? 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。哦!删除重复项解决了我的性能问题。不过,对于科学和其他东西,我仍然有兴趣了解列出这些数据的更有效的方法。这是一个真正的平面列表,我无法轻松地对它们进行分组或分层。
最佳答案
QListWidget
是一个方便的小列表小部件。要获得真正的列表,您应该将 QListView
关联到您重新实现的 QAbstractListModel
。
在您的示例中,列表有 500k 项长!使用真实的数据库来处理这个问题怎么样?使用 Qt,您可以将 QSqlTableModel
关联到 SQLite ,参见doc here 。排序和搜索将在 SQL 中完成,并将结果传播到模型。
注意:如果您使用 python 2.7,请将 range()
替换为 xrange()
,它一次返回一个值,而不是构造 500k 元素的整个列表内存中。
关于performance - 如何更改 QListWidget 实现以提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35049059/