如果我有一个长的未排序的300k元素列表,将首先排序此列表,然后在列表加速代码上执行“for”循环?无论如何我都需要做一个“for循环”,不能使用list comprehension。
sortedL=[list].sort()
for i in sortedL:
(if i is somenumber)
"do some work"
我怎么能向python发信号通知sortedL是排序的而不是读取整个列表。排序列表有什么好处吗?如果有,那我该如何实施?
答案 0 :(得分:7)
您似乎正在考虑对列表进行排序,以便您可以快速查找somenumber
。
排序是否值得,取决于您是要搜索一次还是重复搜索:
如果您只搜索一次,对列表进行排序不会加快速度。只需遍历列表寻找元素,就完成了。
另一方面,如果需要重复搜索值,请务必对列表进行预排序。这样,您就可以使用bisect
快速查找值。
第三个选项是将元素存储在dict
中。这可能提供最快的查找,但可能比使用列表的内存效率更低。
答案 1 :(得分:3)
python中for
循环的成本不取决于输入数据是否已排序。
话虽如此,如果您先排序,您可以提前break
退出for
循环或在算法级别保存其他计算。
答案 2 :(得分:3)
如果要在排序的list
内进行搜索,则需要一种利用排序的算法。
一种可能性是内置bisect
模块。使用起来有点痛苦,但文档中有一个配方可用于构建简单的排序列表函数。
有了这个食谱,你可以写下这个:
i = index(sortedL, somenumber)
当然,如果您只是为了加速单个搜索而进行排序,这有点愚蠢。排序将花费O(N log N)时间,然后搜索将采用O(log N),总时间为O(N log N);只做线性搜索将花费O(N)时间。因此,除非您通常在同一列表上进行日志N搜索,否则这不值得。
如果您实际上不需要排序,只需快速查找,则可以使用set
代替list
。这为您提供了O(1)查找所有病理案例。
此外,如果您希望在继续添加/删除/等等时保持排序列表,请考虑使用blist.sortedlist
之类的内容而不是普通列表。