有客自远方来52 2024-04-17 21:12 采纳率: 15.3%
浏览 2
已结题

如何减少代码响应时间?(语言-python|开发工具-pycharm)

以下是我的相关代码,当在登陆界面点击登录输入用户名和密码,会首先在对应表中遍历。当用户名和密码没有时,会返回登录错误,如果正确时遍历时间也会很长,但这个遍历的响应时间很长,如何减少它?
登录逻辑函数

def login(self):
    """
    用户登录判断,根据用户名识别用户所属系统,并在对应的数据库中进行登录验证,
    成功则打开相应系统的主窗体。
    :return:
    """
    def check_network_connection():
        try:
            # 尝试连接到知名的公共DNS服务器
            socket.create_connection(('8.8.8.8', 53))
            return True  # 连接成功,表示网络状态正常
        except OSError as e:
            return False  # 连接失败,则表示当前状态无网络

    if not check_network_connection():  # 判断网络是否连接
        self.x = show_custom_message_box("注意!!!", "当前状态无网络,请检查网络连接")
        return

    userName = self.userName.text()
    password = self.password.text()
    if userName.strip() == '' or password.strip() == '':
        self.x = show_custom_message_box("系统提示", "用户名或密码不能为空!")
    else:
        dbUtil.getCon()
        tea_user = Tea(None, None, None, None, None, None, userName, password)
        user_data = TuserDao.login(tea_user)
        if user_data:
            print("登录成功")
            TuserDao.currentUser = tea_user
            self.m = Tmain.Ui_MainWindow()  # 实例化图书管理系统的主窗体
            self.m.show()  # 显示主窗体
            self.hide()  # 隐藏登录窗体
        else:
            self.x = show_custom_message_box("注意!!!", "用户名或密码错误!")

TuserDao

"""数据访问对象"""
from Util import dbUtil
from entity.TuserModel import Tea

# 记录当前用户
currentUser: Tea = None


def login(tuser: Tea):
    con = None
    try:
        con = dbUtil.getCon()
        cursor = con.cursor()
        # 检查用户名
        check_sql = f"SELECT Tuser FROM Teacher WHERE Tuser='{tuser.Tuser}'"
        cursor.execute(check_sql)
        con.commit()
        user = cursor.fetchone()
        print(user)
        if user is  None:
            return 0
        # 检查密码
        check_sql = f"SELECT Tpassword FROM Teacher WHERE Tpassword='{tuser.Tpassword}'"
        cursor.execute(check_sql)
        con.commit()
        Pass = cursor.fetchone()
        print(Pass)
        if Pass is  None:
            return 0
        # 登录判断
        cursor.execute(f"SELECT * FROM Teacher WHERE Tuser='{tuser.Tuser}' AND Tpassword='{tuser.Tpassword}'")
        return cursor.fetchone()
    except Exception as e:
        print(e)
    finally:
        dbUtil.closeCon(con)


TuserModel


class Tea:
    # 编号
    TID = None
    # 姓名
    Tname = None
    # 年龄
    Tage = None
    # 性别
    Tsex = None
    # 联系电话
    Tphone = None
    # 住址
    Taddress = None
    # 用户名
    Tuser = None
    # 密码
    Tpassword = None

    def __init__(self, TID, Tname, Tage, Tsex, Tphone, Taddress, Tuser, Tpassword):
        self.TID = TID
        self.Tname = Tname
        self.Tage = Tage
        self.Tsex = Tsex
        self.Tphone = Tphone
        self.Taddress = Taddress
        self.Tuser = Tuser
        self.Tpassword = Tpassword


  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-04-17 21:28
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:在登录界面中,遍历时间很长,如何减少遍历时间? 建议:
    1. 优化数据库查询语句:可以通过加索引、使用预编译语句、避免使用SELECT *等方法优化查询速度,从而减少遍历时间。
    2. 对用户名和密码进行加密处理:可以增加安全性同时也可以减少查询时间,因为数据库中存储的是加密后的用户名和密码,查询时也需要对输入的用户名和密码进行加密后再去查询,这样可以避免对所有的用户都进行全表扫描。
    3. 缓存登录状态:在登录成功后,可以将登录状态缓存到本地,下次登录时如果缓存中存在对应的状态,就不需要再去遍历数据库验证,直接使用缓存状态进行登录,从而减少查询时间。 代码示例: 优化查询语句:
    # 修改TuserDao中的login函数
    def login(tuser: Tea):
        con = None
        try:
            con = dbUtil.getCon()
            cursor = con.cursor()
            # 检查用户名
            check_sql = f"SELECT Tuser FROM Teacher WHERE Tuser='{tuser.Tuser}'"
            cursor.execute(check_sql)
            con.commit()
            user = cursor.fetchone()
            if user is None:
                return 0
            # 检查密码
            check_sql = f"SELECT Tpassword FROM Teacher WHERE Tpassword=MD5('{tuser.Tpassword}')"
            cursor.execute(check_sql)
            con.commit()
            Pass = cursor.fetchone()
            if Pass is None:
                return 0
            # 登录判断
            cursor.execute(f"SELECT * FROM Teacher WHERE Tuser='{tuser.Tuser}' AND Tpassword=MD5('{tuser.Tpassword}')")
            return cursor.fetchone()
        except Exception as e:
            print(e)
        finally:
            dbUtil.closeCon(con)
    

    缓存登录状态:

    # 在login函数中修改如下:
    def login(tuser: Tea):
        # 判断是否之前已经登录成功过
        if TuserDao.currentUser is not None:
            if TuserDao.currentUser.Tuser == tuser.Tuser and TuserDao.currentUser.Tpassword == tuser.Tpassword:
                return TuserDao.currentUser
        con = None
        try:
            con = dbUtil.getCon()
            cursor = con.cursor()
            # ...
            # 登录判断
            cursor.execute(f"SELECT * FROM Teacher WHERE Tuser='{tuser.Tuser}' AND Tpassword=MD5('{tuser.Tpassword}')")
            user = cursor.fetchone()
            if user is not None:
                # 缓存当前用户状态
                TuserDao.currentUser = tuser
                return user
        except Exception as e:
            print(e)
        finally:
            dbUtil.closeCon(con)
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月18日
  • 创建了问题 4月17日

悬赏问题

  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式
  • ¥15 如果要做一个老年人平板有哪些需求