你可以通过排序加速python中的“for”循环吗?

时间:2012-12-18 21:11:55

标签: python list

如果我有一个长的未排序的300k元素列表,将首先排序此列表,然后在列表加速代码上执行“for”循环?无论如何我都需要做一个“for循环”,不能使用list comprehension。

sortedL=[list].sort() 

for i in sortedL:
  (if i is somenumber)
     "do some work"

我怎么能向python发信号通知sortedL是排序的而不是读取整个列表。排序列表有什么好处吗?如果有,那我该如何实施?

3 个答案:

答案 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之类的内容而不是普通列表。