当前位置: 首页 > 面试题库 >

在Django中,检查空查询集的最有效方法是什么?

陆正奇
2023-03-14
问题内容

我听说过使用以下方法的建议:

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 / 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.exists():1.21 usc / pass
  • qs.count():1.16 usec / pass
  • qs[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的第一个条件为假,则评估结束。