weixin_44532019 2024-07-27 18:56 采纳率: 68%
浏览 16
已结题

python for 循环速度慢

django for 循环 影响速度

在数据库中查询了 数据数据量不是很大 一共6条信息
判断这六条信息中 taxClassificationCode 自动是否是 None
如果 没有 none
把这些数据存入数据库中
经过测试 循环位置影响速度 处理六条信息 就用了4秒

寻优化方式

        ###查询数据库中的数据
        data_mx = models.Ssflbm.objects.filter(userID=row_object["userID"], tradeNo=i).values("definedData","tradeNo",'goodsName','taxClassificationCode','specificationModel','meteringUnit','quantity','includeTaxFlag','unitPrice','invoiceAmount','taxRateValue','discountAmount','userID','zeroTaxFlag','preferentialPolicyFlag','vatSpecialManage','droucode')
        print(data_mx)
        ###循环判断数据是否是空
        for i in data_mx:
            if i['taxClassificationCode'] == None:
                return JsonResponse({"code": 1,
                                     'msg': f"税收分类编码或税率不存在点击查看并维护! 单据编号:{i['tradeNo']} 商品编号:{i['droucode']}"})
        #### 拼接字典
        for i in data_mx:
            data_lisit_mx = {
                    "definedData": i['definedData'],
                    "tradeNo": i["tradeNo"],
                    "goodsName": i["goodsName"],
                    "taxClassificationCode": i['taxClassificationCode'],
                    "specificationModel": i["specificationModel"],
                    "meteringUnit": i["meteringUnit"],
                    "quantity": i["quantity"],
                    "includeTaxFlag": '1',
                    "unitPrice": i["unitPrice"],
                    "invoiceAmount": i["invoiceAmount"],
                    "taxRateValue": i['taxRateValue'],
                    "discountAmount": i["discountAmount"],
                    "userID": i["userID"],
                    'zeroTaxFlag': i["zeroTaxFlag"],
                    'preferentialPolicyFlag': i["preferentialPolicyFlag"],
                    'vatSpecialManage':i["vatSpecialManage"]
                }
            ##开始保存保存明细
            form = T_data_list_mx_js(data=data_lisit_mx)
            if form.is_valid():  # 如果信息没有问题准备插入
                form.save()
            else:
                print(form.errors)
                return JsonResponse({"code": 1,'msg': f"数据错误"})

  • 写回答

7条回答 默认 最新

  • 专家-司宇[在线] 2024-07-27 18:56
    关注

    引自免费微信小程序:皆我百晓生

    首先,你的代码在处理数据库查询和循环检查None值时存在一些问题。以下是针对这些问题的优化建议和一些修改建议。注意这些改动是建立在你提供的信息基础上的假设。

    数据库查询优化

    使用Django ORM查询数据时,你通常不需要遍历结果集去检测某个字段是否为None。你可以使用Django的查询API来直接过滤出你想要的数据。在你的情况下,你可以直接在数据库查询时过滤掉taxClassificationCodeNone的记录。这将大大提高查询效率。以下是一个优化后的查询过程示例:

    # 查询不包含None的taxClassificationCode的数据
    data_query = models.Ssflbm.objects.filter(userID=row_object["userID"], tradeNo=i, taxClassificationCode__isnull=False)
    

    循环优化

    对于后续的循环操作,由于你已经过滤掉了包含None的数据,所以不需要再次检查。同时,为了进一步提高效率,可以考虑使用Django的批量插入功能而不是逐一保存数据。以下是修改后的循环部分代码:

    # 使用列表存储所有数据字典
    data_list = []
    for item in data_query:
        data_list.append({
            "definedData": item['definedData'],
            "tradeNo": item["tradeNo"],
            # ... 其他字段赋值 ...
        })
    
    # 使用bulk创建对象并批量保存数据
    T_data_list_mx_js.objects.bulk_create([T_data_list_mx_js(data=data) for data in data_list])
    

    整体优化建议:

    1. 使用Django的查询API进行更精确的查询,避免不必要的循环检查。
    2. 使用批量插入功能以提高数据插入的效率。这减少了数据库的交互次数,从而提高了性能。但请注意,bulk_create() 方法的行为可能依赖于你的Django版本和模型定义。确保在你的环境中测试它。
    3. 考虑添加索引以提高数据库查询性能(如果你的数据库支持的话)。特别是对于频繁查询的字段(如 userID, tradeNo, taxClassificationCode 等)。这取决于你的数据库类型和配置。对于MySQL数据库,你可以考虑在相关字段上添加索引来提高查询性能。对于其他数据库系统,也有类似的优化手段。
    4. 如果可能的话,考虑使用异步处理来并行处理数据,这可以进一步提高处理速度。但这取决于你的应用架构和具体需求。异步处理通常适用于I/O密集型任务,如数据库操作和网络调用等。在你的场景中,这可能是一个可行的解决方案,尤其是当处理大量数据时。但要注意,引入异步处理也会增加系统的复杂性,所以务必仔细评估其适用性。

    希望这些建议能帮助你提高代码的性能!如果有任何其他问题或需要进一步的解释,请告诉我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 8月5日
  • 已采纳回答 7月28日
  • 创建了问题 7月27日

悬赏问题

  • ¥15 微软硬件驱动认证账号申请
  • ¥15 有人知道怎么在R语言里下载Git上的miceco这个包吗
  • ¥15 GPT写作提示指令词
  • ¥20 如何在cst中建立这种螺旋扇叶结构
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥20 想写一个文件管理器,加载全部子文件夹后,要一级一级返回
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?
  • ¥15 请问GPT语言模型怎么训练?