【问题标题】:Python Inherited Module Import SpeedPython继承模块导入速度
【发布时间】:2017-07-01 16:49:59
【问题描述】:

我将把这个问题保持得相当笼统,因为我觉得很多人都在做同样的事情,而我找不到合适的答案。

使用 PyQt(4 或 5)制作每个人都需要的程序主要有以下几行:

from PyQt5 import QtCore, QtGui 
from PyQt5.QtWidgets import QWidget

对于某人想要创建的每个小部件,他们或多或少都需要编写这两行。有没有办法(快速)导入所有这些行,而不必为每个子小部件导入它们?

为了进一步澄清,假设我有一个主类 MainWindow 调用它的子小部件 Child

from PyQt5 import QtCore, QtGui 
from PyQt5.QtWidgets import QWidget

from ChildWidget import Child

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        widget1 = Child(self)
        ....

文件ChildWidget 的结构类似于

from PyQt5 import QtCore, QtGui 
from PyQt5.QtWidgets import QWidget

class Child(QWidget):
    def __init__(self, parent):
        super(Child, self).__init__(parent)
....

(当然,每个小部件的导入会有所不同,但这两个将始终存在。)

我知道除了ChildWidget 中的常规两次导入,我可以使用from MainWindow import * 来导入MainWindow 中的所有内容,但我觉得这很慢,因为它是循环导入所有内容?

所以我的问题是,随着小部件数量的增加,如果速度是一个主要问题,那么在每个小部件中导入相同功能的最佳方式是什么?

【问题讨论】:

  • Python 导入每个程序只执行一次。任何重复的导入语句都只是查找缓存的版本,以您建议的方式使用时会产生很少的开销。没有必要在子模块中避免它们。

标签: python python-3.x import pyqt


【解决方案1】:

这些似乎是主要的可能性(忽略微小的变化):

  1. 模块命名空间:

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    widget = QtWidgets.QWidget()
    
  2. 带别名的模块命名空间:

    from PyQt5 import QtCore as qc, QtGui as qg, QtWidgets as qw
    
    widget = qw.QWidget()
    
  3. 明星进口:

    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    widget = QWidget()
    
  4. 全局命名空间:

    from PyQt5 import Qt
    
    widget = Qt.QWidget()
    
  5. 全球明星导入:

    from PyQt5.Qt import *
    
    widget = QWidget()
    
  6. 个别进口:

    from PyQt5.QtCore import Qt, QTimer
    from PyQt5.QtCore import QColor, QFont
    from PyQt5.QtCore import (
        QApplication, QWidget, QVBoxLayout, QPushButton,
        QLineEdit, QListWidget,
        )
    

选项 3 用数百个永远不会使用的名称污染模块命名空间,generally frowned upon 也是如此。选项 4 看起来很诱人,但如果您关心应用程序的启动时间,那么它不是一个糟糕的解决方案,因为它会导入 每个 模块,包括像 QtWebEngine 这样的资源消耗。选项 5 结合了选项 3 和 4 最糟糕的方面,但它确实让你真正一切

选项 1(和选项 2,在较小程度上)的主要好处是它绝对清楚地说明了名称的来源。这意味着它是教程和示例的理想选择。额外的清晰度是以更冗长为代价的,但是,如果您的编辑器具有自动完成功能,这不是什么大问题。我个人偏爱选项 6,因为它似乎是最好的全面折衷方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2017-05-21
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多