いくつかのことに依存しますが、最初に頭に浮かぶのは、heapqモジュールを使用することです。
import heapq
heap = []
for row in rows:
heapq.heappush(heap, (row[1], row))
これにより、タプルでいっぱいのヒープが作成されます。最初の要素は並べ替える要素で、2番目の要素は行です。
それらをヒープから読み戻す最も簡単な方法は、それをコピーしてからアイテムをポップすることです。
new_heap = list(heap)
while new_heap:
_, row = heapq.heappop(new_heap)
print row
各アイテムをヒープに挿入する実行時間はO(lg N)
であるため、ヒープの作成には時間がかかりO(N lg N)
、ヒープからのアイテムのポップにも時間がO(lg N)
かかるため、ヒープO(N lg N)
をトラバースするのに時間がかかります。
これらのトレードオフが理想的でない場合は、バイナリ検索ツリーを使用できます(標準ライブラリには存在しませんが、簡単に見つけることができます)。または、他のコメント提供者が示唆しているように、行を読んだ後に並べ替えますrows.sort(key=lambda row: row[1])
。
さて、実際には、非常に多くの行を処理している場合を除いて、リストをロードした後(つまり、.sort()
メソッドを使用して)、リストをインプレースで並べ替える方がほぼ確実に高速です。何が最も効果的か。
最後に、bisect
Pythonリストへの挿入にはO(N)
時間がかかるため、これはお勧めできません。したがって、bisectを使用してアイテムを挿入するには、アイテムごとO(N lg N)
に時間が必要になるため、合計時間になります。O((N lg N) * N) = O(N**2)