You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化Django Model场景下大量对象的创建效率?

20万条CSV数据批量生成Django模型实例的提速方案

核心优化逻辑

你遇到的users_list.append(User(phone_number=phone_number))耗时过长,本质是20万次重复调用Django模型构造函数、触发内部字段校验/属性赋值逻辑导致的额外开销,可通过以下方法优化:

  • 用列表推导替代逐行append操作
    Python的列表推导底层做过C级优化,比for循环内逐次调用append的速度提升30%~50%,示例代码:
import csv
from yourapp.models import User

with open("users.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    # 直接通过列表推导一次性生成所有实例
    users_list = [User(phone_number=row["phone_number"]) for row in reader]

# 批量插入时指定batch_size,避免内存溢出,建议值1000~3000
User.objects.bulk_create(users_list, batch_size=2000)
  • 更换更快的CSV读取工具,避免逐行IO开销
    如果CSV字段简单,直接用pandas批量读取后生成实例,比内置csv库逐行读取快1~2倍,读取时指定字段类型可跳过pandas自动类型推断的耗时:
import pandas as pd
from yourapp.models import User

# 读取时指定dtype,避免电话号码被转为数字导致格式错误
df = pd.read_csv("users.csv", dtype={"phone_number": str})
users_list = [User(phone_number=item["phone_number"]) for item in df.to_dict("records")]
User.objects.bulk_create(users_list, batch_size=2000)
  • 跳过不必要的模型逻辑开销
    如果你的模型没有自定义clean()方法、且CSV数据已经提前完成校验,可跳过Django的字段校验逻辑,速度可提升2倍以上:
users_list = []
for row in reader:
    user = User()
    # 直接赋值属性,跳过构造函数的字段校验
    user.phone_number = row["phone_number"]
    users_list.append(user)
  • 极端场景下直接用原生SQL批量插入
    如果不需要使用Django ORM的任何特性,可直接通过数据库游标执行批量插入,速度比bulk_create再快3~5倍,示例:
from django.db import connection

with open("users.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    values = [(row["phone_number"],) for row in reader]

with connection.cursor() as cursor:
    # 批量执行插入
    cursor.executemany(
        "INSERT INTO yourapp_user (phone_number) VALUES (%s)",
        values
    )

内容的提问来源于stack exchange,提问作者Mohit Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:36:04