如果我需要查询集中的所有对象以及从这些对象中的一小部分归档值,那么考虑到速度和应用程序内存的使用(我正在使用),该选项会更好postgresql后端):
选项A:
def get_data():
queryset = MyObject.objects.all()
total_objects = queryset.count()
thumbs = queryset[:5].values_list('thumbnail', flat=True)
return {total_objects:total_objects, thumbs:thumbs}
选项B:
def get_data():
objects = list(MyObject.objects.all())
total_objects = len(objects)
thumbs = [o.thumbnail for o in objects[:5]]
return {total_objects:total_objects, thumbs:thumbs}
如果我正确理解事情,如果我错了,当然可以纠正我:
选项A:它将两次击中数据库,仅导致total_objects =整数和拇指=存储器中的字符串列表。
选项B:它将一次访问数据库,并将导致所有对象的列表及其所有已提交的数据 选项A内存中的项目。
考虑这些选项,并且可能存在数百万个MyObject的实例:一个数据库的速度是否命中(选项A)比单个数据库的记忆消耗更可取(选项B)?
我的优先级是返回数据的总体速度,但是我担心更大的内存消耗速度比额外的数据库命中率更大。
使用SQL是最快的方法,即使它更多地击中了数据库,也将始终击败Python等效。相比之下,差异可以忽略不计。请记住,这就是SQL是的意思是要做 - 要快速有效。
无论如何,使用TimeIt运行一千个循环,这些是结果:
In [8]: %timeit get_data1() # Using ORM
1000 loops, best of 3: 628 µs per loop
In [9]: %timeit get_data2() # Using python
1000 loops, best of 3: 1.54 ms per loop
您可以看到,第一种方法需要每循环628微秒,而第二种方法则采用1.54 毫秒。那几乎是2.5倍!明确的赢家。
我使用了一个只有100个对象的SQLite数据库(我使用自动固定来垃圾邮件)。我猜PostgreSQL会返回不同的结果,但我仍然赞成第一个结果。