guardianpeak 发表于 2020-8-24 20:12:54

python+PYQT5写了一个小工具,运行效率无法忍受,求大神指点

本帖最后由 guardianpeak 于 2020-8-24 21:44 编辑


#### 求助描述与问题:

- 数据读取速度很正常(可在access_select模块中单独测试),但是在循环写入时会耗费很长时间,目前数据库中只有几百条数据,经测试需要10秒左右才能展现出来

- 真正使用的数据库是sqlserver,正常查询时可能会有上万条数据,自己测试过16列4000行数据的情况需要近一个小时才会展示出数据,毫无可用性。

- 目前不知道是PYQT5的问题还是可以有更好的写入方法,求大神给予帮助

具体描述与代码在附件中

hrp 发表于 2020-8-24 20:23:45

本帖最后由 hrp 于 2020-8-24 20:25 编辑

写入数据关QT5什么事?你是说在QT5界面显示文本?

guardianpeak 发表于 2020-8-24 20:44:33

hrp 发表于 2020-8-24 20:23
写入数据关QT5什么事?你是说在QT5界面显示文本?

是的,我读出数据库的数据,展示在QT的表格控件中

xiaochuan8264 发表于 2020-8-24 21:00:44

还没跑你的程序,个人觉得,和你的那1.6M的.py文件有关系吧,不能把里面的文本内容单独存放然后打开吗...

hrp 发表于 2020-8-24 21:08:34

guardianpeak 发表于 2020-8-24 20:44
是的,我读出数据库的数据,展示在QT的表格控件中

QT5的效率再差也不会这么慢的,检查一下你的代码逻辑吧。我看到你的压缩包有点大不敢看了。{:10_250:}

guardianpeak 发表于 2020-8-24 21:27:22

xiaochuan8264 发表于 2020-8-24 21:00
还没跑你的程序,个人觉得,和你的那1.6M的.py文件有关系吧,不能把里面的文本内容单独存放然后打开吗...

那个是资源文件,其实可以不需要的,倒是没啥,改下界面里的代码就能整个去掉,理论上不是影响速度的因素

guardianpeak 发表于 2020-8-24 21:28:42

hrp 发表于 2020-8-24 21:08
QT5的效率再差也不会这么慢的,检查一下你的代码逻辑吧。我看到你的压缩包有点大不敢看了。

压缩包大是因为有一个Access文件和一个资源文件在里面,资源文件可以干掉,Access应该不影响吧

guardianpeak 发表于 2020-8-24 21:45:47

资源文件已经干掉了,现在没有资源文件,代码也不长啊,主要就是一个循环SET耗时太多,实在不知道该怎么优化了

hrp 发表于 2020-8-24 23:00:59

本帖最后由 hrp 于 2020-8-24 23:12 编辑

guardianpeak 发表于 2020-8-24 21:45
资源文件已经干掉了,现在没有资源文件,代码也不长啊,主要就是一个循环SET耗时太多,实在不知道该怎么优 ...

应该是重复运行 table_item.select_access() 方法导致的,我没有测试环境,也不怎么会数据库,随手改了一下,你试试。
table_pane.py 文件
from PyQt5.Qt import *
from table import Ui_Form
from access_select import Select_Table
import sys


class tablepane(QWidget, Ui_Form):

    table_close_signal = pyqtSignal()

    def __init__(self, parent=None):
      super().__init__(parent)
      self.setupUi(self)

    # 发射自定义关闭按钮的信号
    def table_close(self):
      self.table_close_signal.emit()

    # 原定发射信号由MAIN模块来处理,后决定并入本模块自行处理
    # def table_show(self):
    #   self.table_show_signal.emit()

    # 本模块自行处理表格展示的函数
    def table_show(self):
      # 实例化关联数据库的Select_Table类
      table_item = Select_Table()
      # 获取查询结果的列与行数
      lst = table_item.select_access()
      column = len(lst)
      row = len(lst)
      # 建立行数
      self.tableWidget.setRowCount(row)

      # 循环写入表内数据
      for i in range(row):
            for j in range(column):
                self.tableWidget.setItem(i, j, QTableWidgetItem(str(lst)))

      # 关闭数据连接
      table_item.close_odbc()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = tablepane()
    window.show()
    sys.exit(app.exec_())

guardianpeak 发表于 2020-8-25 09:00:02

hrp 发表于 2020-8-24 23:00
应该是重复运行 table_item.select_access() 方法导致的,我没有测试环境,也不怎么会数据库,随手改了 ...

非常感谢,又学到了,就是这个问题,以后这种问题还真得注意了

hrp 发表于 2020-8-25 10:12:18

guardianpeak 发表于 2020-8-25 09:00
非常感谢,又学到了,就是这个问题,以后这种问题还真得注意了

这个问题算是比较明显的了,那个方法的作用是连接数据库、读取、关闭,而连接数据库的耗时是比较长的。你原来的写法每设置一个表格位置就要连接一次数据库,速度之慢可想而知,而且是没有必要从数据库重复获取同样的数据的。{:10_266:}

rsj0315 发表于 2020-11-17 13:58:47

guardianpeak 发表于 2020-8-25 09:00
非常感谢,又学到了,就是这个问题,以后这种问题还真得注意了

楼主加个好友吧,我刚开始学pyqt,也是结合access使用。
网上找access的资源太少了

lirenbing01 发表于 2020-11-17 17:00:28

rsj0315 发表于 2020-11-17 13:58
楼主加个好友吧,我刚开始学pyqt,也是结合access使用。
网上找access的资源太少了

sqlite比access更实用些

guardianpeak 发表于 2020-12-9 17:59:20

rsj0315 发表于 2020-11-17 13:58
楼主加个好友吧,我刚开始学pyqt,也是结合access使用。
网上找access的资源太少了

数据库无所谓的,我用access只是因为简单,微软系的。跟QT学习没太大关系
页: [1]
查看完整版本: python+PYQT5写了一个小工具,运行效率无法忍受,求大神指点