Python django queryset运行时-以恒定时间获取第n个条目

Python django queryset运行时-以恒定时间获取第n个条目,python,django,runtime,big-o,django-queryset,Python,Django,Runtime,Big O,Django Queryset,我使用多种方法通过不同的django查询集从db获取数据, 但是我想知道每个queryset的运行时间,如果可能的话,还有更好的方法(以恒定时间获取数据!!) 要获得第一个条目,我将执行以下操作: entry = list(qs[:1]) first_entry = entry[0] 或获取第十个也是最后一个条目: entry = list(qs) some_entry = entry[9] last_entry = entry[-1] 但我相信这需要O(n)时间,有没有办法得到常数时间内

我使用多种方法通过不同的django查询集从db获取数据, 但是我想知道每个queryset的运行时间,如果可能的话,还有更好的方法(以恒定时间获取数据!!)

要获得第一个条目,我将执行以下操作:

entry = list(qs[:1])
first_entry = entry[0]
或获取第十个也是最后一个条目:

entry = list(qs)
some_entry = entry[9]
last_entry = entry[-1] 
但我相信这需要O(n)时间,有没有办法得到常数时间内的第n项? 我不想使用get(),因为我不知道条目的id或其他值(已排序),而只知道位置

我也可以使用annotate,但这也需要O(n)运行时

我知道该职位只需要在固定时间内输入?

来自文档:

使用Python数组切片语法的子集将查询集限制为一定数量的结果。这相当于SQL的LIMIT和OFFSET子句

通常,切片查询集会返回一个新的查询集–它不会对查询求值。例外情况是,如果使用Python切片语法的“step”参数

要检索单个对象而不是列表(例如,从bar LIMIT 1中选择foo),请使用简单索引而不是切片


切分时不评估查询集是最重要的部分。

感谢您的回复,我以前看过此文档,但我想我不明白!因此,当我们执行
Entry.objects.all()[0]
时,这只会影响db,而不是所有条目?是的,这会将它变成一个有限的查询集,告诉db在计算它时只需要一个值。如果您不确定,可以查看通过各种方法执行的确切查询-我发现Django工具栏包很有用:我真的不认为big O是一个有用的指标。正如Peter指出的那样,使用切片将工作推到数据库上,但是限制/偏移查询可能仍然会进行一些线性时间工作,以在索引中找到正确的起点——只是这项工作得到了高度优化。
entry = list(qs)
some_entry = entry[9]
last_entry = entry[-1] 
MyModel.objects.values('date').annotate(min_value=Min('value')).order_by('min_value')[0]