鱼C论坛

 找回密码
 立即注册
查看: 3356|回复: 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 文件
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[0])
        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[i][j])))

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


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

一个小工具求助.rar

113.81 KB, 下载次数: 5

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

写入数据关QT5什么事?你是说在QT5界面显示文本?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的,我读出数据库的数据,展示在QT的表格控件中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

QT5的效率再差也不会这么慢的,检查一下你的代码逻辑吧。我看到你的压缩包有点大不敢看了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那个是资源文件,其实可以不需要的,倒是没啥,改下界面里的代码就能整个去掉,理论上不是影响速度的因素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

压缩包大是因为有一个Access文件和一个资源文件在里面,资源文件可以干掉,Access应该不影响吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 21:45:47 | 显示全部楼层
资源文件已经干掉了,现在没有资源文件,代码也不长啊,主要就是一个循环SET耗时太多,实在不知道该怎么优化了
想知道小甲鱼最近在做啥?请访问 -> 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 文件
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[0])
        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[i][j])))

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


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = tablepane()
    window.show()
    sys.exit(app.exec_())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

非常感谢,又学到了,就是这个问题,以后这种问题还真得注意了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

楼主加个好友吧,我刚开始学pyqt,也是结合access使用。
网上找access的资源太少了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

sqlite比access更实用些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

数据库无所谓的,我用access只是因为简单,微软系的。跟QT学习没太大关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 03:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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