django从数据库里取数据太慢了

godqiao 2018-02-24 01:09:38
大神帮忙看一下,为什么我的程序运行这么慢,等到get_pe_ttm函数返回数据要2,3十秒,受不了啊。
在网上查阅了相关资料,了解到:

1 Django的queryset是惰性的,使用filter语句进行查询,实际上并没有运行任何的要真正从数据库获得数据

2 只要你查询的时候才真正的操作数据库。会导致执行查询的操作有:对QuerySet进行遍历queryset,切片,序列化,对 QuerySet 应用 list()、len()方法,还有if语句

3 当第一次进入循环并且对QuerySet进行遍历时,Django从数据库中获取数据,在它返回任何可遍历的数据之前,会在内存中为每一条数据创建实例,而这有可能会导致内存溢出。
所以,我检查了一下,应该是序列化serializers.serialize的时候开始实际从数据库中查询数据了,因此导致整个程序慢了下来,但我不知道有啥解决的办法么?


@require_http_methods(["GET"])
def get_pe_ttm(requst):
response = {}
pettm_list = []
pe = []
pe_num = []
try:
pettm = daily_stock_market.objects.filter(stock_code='000001.SZ',market_date__gte=datetime(2016,12,12)).exclude(market_date__gte=datetime(2017,12,12))
middlterm = serializers.serialize("json",pettm,fields=('day_pe_ttm','market_date'))
pettm_list=json.loads(middlterm)
pettm_length=len(pettm_list)
for i in range(0,pettm_length):
if pettm_list[i]['fields']['market_date'] not in pe_num:
pe.append(pettm_list[i]['fields'])
pe_num.append(pettm_list[i]['fields']['market_date'])
response['list'] = pe
response['msg'] = 'success'
response['error_num'] = 0
except Exception as e:
response['msg'] = str(e)
response['error_num'] = 1
# return HttpResponse(JsonResponse(response),content_type='application/json')
return JsonResponse(response)
...全文
2048 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyiant 2018-02-25
  • 打赏
  • 举报
回复
你的表里面有多少数据?一定在serializer那边变慢的,前一句不会真的查数据库。你的两个搜索条件的字段有没有建索引。没得话,建个索引试试。
混沌鳄鱼 2018-02-24
  • 打赏
  • 举报
回复 2
第8行改成这面这样试一下。 start_date = datetime.date(2016, 12, 12) end_date = datetime.date(2017, 12, 12) pettm = daily_stock_market.objects.filter(stock_code='000001.SZ',market_date__range=(start_date, end_date)) 另外你这算法写的很弱【此处略去1字】,从数据库里取出直接就可以处理了,你却先序列化再jsonload这不是白浪费时间么。
oyljerry 2018-02-24
  • 打赏
  • 举报
回复
数据库查询对应的数据是不是很慢。然后就是查询的数据量是不是很大

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧