我听说过使用以下方法的建议:
if qs.exists():
...
if qs.count():
...
try:
qs[0]
except IndexError:
...
从下面的评论中复制:“我正在寻找这样的语句:在MySQL和PostgreSQL中,对于短查询,count()更快,对于长查询,exist(()更快,并且在可能的情况下使用QuerySet
[0]将需要第一个元素,并且您要检查它是否存在。但是,当count()更快时,它仅略微更快,因此建议在两者之间进行选择时始终使用exist()。”
exist()通常比count()更快,尽管并非总是如此(请参见下面的测试)。count()可用于检查存在性和长度。
仅qs[0]
在确实需要该对象时使用。如果您仅测试存在性,则速度会明显变慢。
在Amazon SimpleDB上,400,000行:
qs
:325.00 usec / passqs.exists()
:144.46 usec / passqs.count()
144.33 usec / passqs[0]
:324.98 usec / pass在MySQL上,有57行:
qs
:1.07 usec / passqs.exists()
:1.21 usc / passqs.count()
:1.16 usec / passqs[0]
:1.27微秒/通过我对每个通道使用了随机查询,以降低数据库级缓存的风险。测试代码:
import timeit
base = """
import random
from plum.bacon.models import Session
ip_addr = str(random.randint(0,256))+'.'+str(random.randint(0,256))+'.'+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)
问题内容: 建议的用于检查查询是否返回任何结果的惯用法是什么? 例: 我想有几种不同的检查方法,但是我想知道一个有经验的Django用户将如何做。文档中的大多数示例只是忽略了什么都没有发现的情况… 问题答案:
问题内容: 我有一个非常大的NumPy数组 我想检查数组的第一列中是否存在一个值。我有很多本地方法(例如遍历每一行并进行检查),但是鉴于数组的大小,我想找到最有效的方法。 谢谢! 问题答案: 怎么样 编辑:我认为以与@detly版本相同的方式实现
问题内容: 我正在尝试在Windows上的Java中检查日志文件是否为空(表示没有错误)。到目前为止,我已经尝试使用2种方法。 方法1(失败) 方法2(失败) 现在,这两种方法都会在日志文件为空(没有内容)但文件大小不为零(2字节)时失败。 检查文件是否为空的最有效 , 最准确的方法是什么?我要求提高效率,因为我必须循环检查数千次文件大小。 注意: 文件大小只会在几到10 KB左右徘徊! 方法3(
我有两种方法来检查列表是否为空 而且 我的拱门告诉我前者比后者好。但我认为后者更好。 谁能澄清一下吗?
问题内容: 我正在使用Hibernate检索特定查询的行数。假设我有一个名为“ Person”的表,其中包含各种列。这些列之一是“名称”。 如果我想获得带有“安德鲁”名字的人数,以下哪种方法最有效?假设某些/全部之间存在性能差异。使用Hibernate / SQL是否有更好的方法? (1)选择所有列 (2)仅选择名称列 (3)在查询中使用Count (4)在查询中的名称列中使用Count 编辑:对
问题内容: 在调用对象的函数之前,我需要检查对象是否为null,以避免引发。 最好的方法是什么?我考虑过这些方法。 哪一种是Java最佳编程实践? 问题答案: 方法4是最好的。 将使用短路评估,这意味着如果a的第一个条件为假,则评估结束。