我有3张桌子,他们之间相互依存。我也有一些serializers.SerializerMethodField
,它是“ elapsed_time”这个字段,用于计算elapsed_time,所以我如何根据那个MethodField排序我的实体。我发现要对serializer.data进行排序的一种方法是返回OrderedList,但这种方法要花大量时间进行2k记录。
serializer = self.get_serializer(entites, many=True)
result_page = get_pool_ordered_queryset(serializer.data)
get_pool_ordered_queryset函数接受OrderedDict和排序。
serializer_data = sorted(serializer_data, key=lambda k: k['elapsed_time'], reverse=True)
就像这样,但是当我添加2k时,记录将近2分钟。
答案 0 :(得分:0)
我想你的问题是如何加快这一过程。
首先,您不将OrderedDict
传递给get_pool_ordered_queryset
,而是传递list
个值中的dict
,这就是serializer.data
返回的结果。
然后,您花费了大部分时间,计算的时间是elapsed_time
的2千倍。您应该尝试将这部分计算移至SQL并在那里进行排序。
您可能应该使用django queryset的annotate
,并使用它的order
。
这将大大减少您的计算时间。
答案 1 :(得分:0)
sorted()
函数可能不是此处的时间消耗因素。您说有3个相关表。 Django Queryset's are Lazy,因此3个相关表中的2k项可能消耗大约 2k x 3 数据库连接,这非常昂贵/耗时
示例:
In [1]: def get_time(mylist):
...: pre_time = time.time()
...: sorted(mylist, key=lambda x: x['value'])
...: return "time consumed {}".format(time.time() - pre_time)
...:
...:
In [2]:
...: import time
...: from random import randint
...:
...:
In [3]:
...: mylist = [] # creates a list of dict as [ {"value":3},{"value":1},{"value":32},...]
...: for i in range(4000):
...: mylist.append({"value": randint(1, 999999)})
...:
In [4]: get_time(mylist)
Out[4]: 'time consumed 0.007257938385009766'
从这个例子中我们可以理解,时间的消耗完全是由于 Django Queryset Lazyness 。
为了加快查询速度,您需要某种优化。我建议阅读Django Doc中指定的优化技术对您有帮助