gpt4 book ai didi

python - 优化 `in`

转载 作者:行者123 更新时间:2023-11-28 21:28:17 29 4
gpt4 key购买 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_Enter属性。
  2. if key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return) 这会在每次运行时构造元组。元组中的搜索是顺序的 - 使用 frozenset 更好?

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

最佳答案

您的代码:

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 加速。您当然可以将其发挥到极致:

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 提到的,我对 in 的测试表明元组比设置更快大约 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
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com