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

Performance 如何更改QListWidget实现以提高性能?,performance,qt,pyqt,Performance,Qt,Pyqt,可以理解,下面的代码显示QList.addItems调用需要0.393秒。我在一个更大的程序中使用了类似的代码——其想法是向用户提供一个(非常)大的唯一零件号列表。他们开始在一个单独的QEntry小部件中输入一个正则表达式,该小部件实时更新QList,随着时间的推移,列表越来越短 我的问题是,对于如此大的列表,当用户输入正则表达式时,更新QList视图需要相当长的时间。我不认为这是一个独特的问题——这个问题的共同解决方案是什么?如何以合理的方式截断列表,以使用户体验不会受到显著的负面影响?QLi

可以理解,下面的代码显示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。啊!删除重复项修复了我的性能问题。不过,对于科学和其他方面,我仍然有兴趣知道列出这些数据的更有效的方法。而且这是一个真正的平面列表,我不能轻易地对它们进行分组或分层

A
QListWidget
是一个方便的小列表小部件。要有一个真正的列表,您应该有一个与您重新实现的
QAbstractListModel
关联的
QListView

在您的示例中,列表长度为500k个项目!用一个真正的数据库来处理这个问题怎么样?使用Qt,您可以查看关联的
QSqlTableModel
,请参阅。排序和搜索将在SQL中完成,结果将传播到模型


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

在平面列表中显示所有元素的目的是什么?这似乎是一个非常糟糕的界面(想象一下,您的文件管理器就是这样工作的)。您可以使用模式逐步减小列表的大小,这意味着数据可以被构造为树。如果是这样,树的每个分支都可以按需填充,而不是一次加载所有内容。