鱼C论坛

 找回密码
 立即注册
查看: 3828|回复: 13

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

[复制链接]
发表于 2020-8-24 20:12:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


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

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

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

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

  具体描述与代码在附件中
最佳答案
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 文件
  1. from PyQt5.Qt import *
  2. from table import Ui_Form
  3. from access_select import Select_Table
  4. import sys


  5. class tablepane(QWidget, Ui_Form):

  6.     table_close_signal = pyqtSignal()

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

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

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

  16.     # 本模块自行处理表格展示的函数
  17.     def table_show(self):
  18.         # 实例化关联数据库的Select_Table类
  19.         table_item = Select_Table()
  20.         # 获取查询结果的列与行数
  21.         lst = table_item.select_access()
  22.         column = len(lst[0])
  23.         row = len(lst)
  24.         # 建立行数
  25.         self.tableWidget.setRowCount(row)

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

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


  32. if __name__ == '__main__':
  33.     app = QApplication(sys.argv)
  34.     window = tablepane()
  35.     window.show()
  36.     sys.exit(app.exec_())
复制代码

一个小工具求助.rar

113.81 KB, 下载次数: 5

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-24 20:23:45 From FishC Mobile | 显示全部楼层
本帖最后由 hrp 于 2020-8-24 20:25 编辑

写入数据关QT5什么事?你是说在QT5界面显示文本?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 20:44:33 | 显示全部楼层
hrp 发表于 2020-8-24 20:23
写入数据关QT5什么事?你是说在QT5界面显示文本?

是的,我读出数据库的数据,展示在QT的表格控件中
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 21:00:44 | 显示全部楼层
还没跑你的程序,个人觉得,和你的那1.6M的.py文件有关系吧,不能把里面的文本内容单独存放然后打开吗...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 21:08:34 From FishC Mobile | 显示全部楼层
guardianpeak 发表于 2020-8-24 20:44
是的,我读出数据库的数据,展示在QT的表格控件中

QT5的效率再差也不会这么慢的,检查一下你的代码逻辑吧。我看到你的压缩包有点大不敢看了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

那个是资源文件,其实可以不需要的,倒是没啥,改下界面里的代码就能整个去掉,理论上不是影响速度的因素
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

压缩包大是因为有一个Access文件和一个资源文件在里面,资源文件可以干掉,Access应该不影响吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 21:45:47 | 显示全部楼层
资源文件已经干掉了,现在没有资源文件,代码也不长啊,主要就是一个循环SET耗时太多,实在不知道该怎么优化了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 文件
  1. from PyQt5.Qt import *
  2. from table import Ui_Form
  3. from access_select import Select_Table
  4. import sys


  5. class tablepane(QWidget, Ui_Form):

  6.     table_close_signal = pyqtSignal()

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

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

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

  16.     # 本模块自行处理表格展示的函数
  17.     def table_show(self):
  18.         # 实例化关联数据库的Select_Table类
  19.         table_item = Select_Table()
  20.         # 获取查询结果的列与行数
  21.         lst = table_item.select_access()
  22.         column = len(lst[0])
  23.         row = len(lst)
  24.         # 建立行数
  25.         self.tableWidget.setRowCount(row)

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

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


  32. if __name__ == '__main__':
  33.     app = QApplication(sys.argv)
  34.     window = tablepane()
  35.     window.show()
  36.     sys.exit(app.exec_())
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

非常感谢,又学到了,就是这个问题,以后这种问题还真得注意了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 10:12:18 From FishC Mobile | 显示全部楼层
guardianpeak 发表于 2020-8-25 09:00
非常感谢,又学到了,就是这个问题,以后这种问题还真得注意了

这个问题算是比较明显的了,那个方法的作用是连接数据库、读取、关闭,而连接数据库的耗时是比较长的。你原来的写法每设置一个表格位置就要连接一次数据库,速度之慢可想而知,而且是没有必要从数据库重复获取同样的数据的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 13:58:47 | 显示全部楼层
guardianpeak 发表于 2020-8-25 09:00
非常感谢,又学到了,就是这个问题,以后这种问题还真得注意了

楼主加个好友吧,我刚开始学pyqt,也是结合access使用。
网上找access的资源太少了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

sqlite比access更实用些
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

数据库无所谓的,我用access只是因为简单,微软系的。跟QT学习没太大关系
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-30 18:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表