sách gpt4 ai đã đi

Tối ưu hóa `in`

In lại 作者:行者123 更新时间:2023-11-28 21:28:17 29 4
mua khóa gpt4 Nike

我正在使用这样的结构来测试是否按下了所需的键:

def eventFilter(self, tableView, event):
if event.type() == QtCore.QEvent.KeyPress:
key = event.key()
if event.modifiers() in (QtCore.Qt.NoModifier, QtCore.Qt.KeypadModifier):
if key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return):
self.menu.editItem.trigger()
return True

我知道“过早的优化是万恶之源”,但我认为 eventFilter 经常被调用以考虑其优化。

我的担忧:

  1. if key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return) 在每次运行时进行双重查找: 1. 在 QtCore 中查找 Qt 属性 模块; 2. 在Qt模块中找到Key_Entertài sản.
  2. if key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return) 这会在每次运行时构造元组。元组中的搜索是顺序的 - 使用 frozenset 更好?

您如何处理此类情况?不在乎?

1 Câu trả lời

您的代码:

def eventFilter(self, tableView, event): 
if event.type() == QtCore.QEvent.KeyPress:
key = event.key()
if event.modifiers() in (QtCore.Qt.NoModifier, QtCore.Qt.KeypadModifier):
if key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return):
self.menu.editItem.trigger()
return True

正如我在对@interjay 的评论中提到的,对于任何类型的 UI 事件都可能多次调用此函数,如果您有许多这样的过滤器,它们可能会导致 UI 缓慢。如果您想至少优化到第一个 if 测试,则将 QtCore.QEvent.KeyPress 的本地定义移动到默认参数值中:

def eventFilter(self, tableView, event,
FILTER_EVENT_TYPE=QtCore.QEvent.KeyPress
):
if event.type() == FILTER_EVENT_TYPE:
if event.modifiers() in (QtCore.Qt.NoModifier, QtCore.Qt.KeypadModifier):
key = event.key()
if key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return):
self.menu.editItem.trigger()
return True

(我还将对 event.key() 的函数调用移动到对 event.modifiers() 的测试之后. )

像这样的默认参数在导入模块时在函数编译时计算一次,而不是每次调用一次,所以你查找QtCore.QEvent.KeyPress Sẽ加速。您当然可以将其发挥到极致:

def eventFilter(self, tableView, event,
FILTER_EVENT_TYPE=QtCore.QEvent.KeyPress
FILTER_MODIFIERS=(QtCore.Qt.NoModifier, QtCore.Qt.KeypadModifier),
FILTER_KEYS=(QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return)
):
if (event.type() == FILTER_EVENT_TYPE and
event.modifiers() in FILTER_MODIFIERS and
event.key() in FILTER_KEYS):
self.menu.editItem.trigger()
return True

现在您不仅优化了模块-对象-属性查找,还优化了元组构造,正如@AndrewDalke 提到的,我对 TRONG 的测试表明元组比设置更快大约 3 或 4 个元素的大小。当条件的任何部分失败时,单个条件仍会短路,因此如果类型不是按键,您将不会收到对 event.modifiers 或 event.key 的调用。

编辑:我喜欢@ekhumoro 对键和修饰符的耦合测试,这是将它合并到我的代码中的样子:

def eventFilter(self, tableView, event,
FILTER_EVENT_TYPE=QtCore.QEvent.KeyPress
FILTER_KEY_MODIFIERS=((QtCore.Qt.Key_Return, QtCore.Qt.NoModifier),
(QtCore.Qt.Key_Enter, QtCore.Qt.KeypadModifier),
)
):
if (event.type() == FILTER_EVENT_TYPE and
(event.key(), event.modifiers()) in FILTER_KEY_MODIFIERS):
self.menu.editItem.trigger()
return True

关于python - 优化 `in`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8655224/

29 4 0
Bài viết được đề xuất: testing - 如何在 Microsoft 测试管理器中查看已关闭的错误
Bài viết được đề xuất: node.js - 如何在有 promise 的测试工厂中使用 spy ?
Bài viết được đề xuất: api - 不同语言的相同测试
Bài viết được đề xuất: wpf - 在测试/开发期间替换 ADFS
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com