我听说过使用以下方面的建议:
if qs.exists(): ... if qs.count(): ... try: qs[0] except IndexError: ...
从以下评论中复制:“我正在寻找一个声明,如”在MysqL和Postgresql中count()对于短查询来说更快,对于长查询来说,exists()更快,并且在可能的时候使用QuerySet [0]需要第一个元素,你想检查它是否存在.然而,当count()更快时,它只是稍微更快,所以建议在两者之间选择时始终使用exists().
解决方法
看起来qs.count()和qs.exists()实际上是等效的.所以我没有发现使用exists()超过count()的一个理由.后者不慢,可以用来检查存在和长度.存在()和count()都可能对MysqL中的同一个查询进行评估.
只有在实际需要该对象时才使用qs [0].如果你只是测试存在,速度会慢得多.
在Amazon SimpleDB上,40万行:
>光盘qs:325.00 usec / pass
> qs.exists():144.46 usec / pass
> qs.count()144.33 usec / pass
> qs [0]:324.98 usec / pass
在MysqL上,57行:
> qs:1.07 usec / pass
> qs.exsts():1.21 usec / pass
> qs.count():1.16 usec / pass
> qs [0]:1.27 usec / pass
import timeit base = """ import random from plum.bacon.models import Session ip_addr = str(random.randint(0,256))+'.'+str(random.randint(0,256)) try: session = Session.objects.filter(ip=ip_addr)%s if session: pass except: pass """ query_variatons = [ base % "",base % ".exists()",base % ".count()",base % "[0]" ] for s in query_variatons: t = timeit.Timer(stmt=s) print "%.2f usec/pass" % (1000000 * t.timeit(number=100)/100000)