performance - 如何更改 QListWidget 实现以提高性能?

标签 performance qt pyqt

可以理解,下面的代码显示 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/

相关文章:

python - QProgressBar 中的 MySQL 咨询

python - 使用箭头键时根据光标位置更改 QDoubleSpinBox 中的 singleStep

algorithm - 符号与数值数学 - 性能

Qt Creator 和主窗口背景图

python - pyqt:如何从 QVBoxLayout 中删除元素?

git - 将现有的 Qt Creator 项目添加到 Git

performance - 关于Akka消息传递性能 : many small messages or less large messages?

c - 如何在 C 语言中改进/加速此频率函数?

c - 通过添加自动变量来缩短执行时间

python - 如何防止 QTabWidget 滚动按钮获得焦点?