哪个过滤器更好更快

时间:2020-04-07 14:36:00

标签: python django

我对django和python还是比较陌生,所以我真的很想知道这两种实现中哪种更好或更快速。我目前正在使用过滤器,但是我想到了,因为我真的很喜欢列表推导,我使用列表推导编写了相同的代码。两种代码的作用完全相同,但是我只想向开发人员了解更多的经验,这是更好的,为什么。下面是两个代码。

posts = Post.objects.filter(approved=True).order_by('-date_posted')

posts = [post for post in Post.objects.all().order_by('-date_posted') if post.approved]

1 个答案:

答案 0 :(得分:0)

未实现.filter(..)来在Django / Python级别执行过滤:使用WHERE(或HAVING在数据库上进行过滤)条款。数据库是旨在存储,检索和聚集大量数据的系统。

如果您经常对approved值进行排序,则会在该列上添加索引:

class Post(models.Model):
    approved = models.BooleanField(db_index=True)

在这种情况下,数据库将添加索引结构,从而使过滤更加有效。

通常最好对数据库进行过滤,因为这意味着数据库需要向Python / Django层传递较少的记录,并且Django必须将较少的对象反序列化成内存对象。因此,即使使用列表理解进行过滤与通过数据库进行过滤一样快,它仍然会降低效率,因为Python / Django首先必须反序列化更多元素。如果元素数量在增加,最终将导致内存问题,因为您无法同时将所有记录存储在内存中。