バックグラウンド
2つのリストがあります。最初のリストにitems
は約250のタプルが含まれ、各タプルには3つの要素が含まれています。
(path_to_a_file, size_in_bytes, modified_time)
2番目のリストには、最大250の要素が含まれています。これは、リストresult
内のパスに基づいて行を検索するデータベースクエリの結果です。items
の要素の数はresult
、それらのファイルがすでにデータベースにあるかどうかによって異なります。
結果の各要素は、SQLAlchemyクエリから返された行オブジェクトであり、行の値の属性が含まれています(、、path
およびmtime
ここhash
で関心のあるものです)
私がやろうとしているのは、同じmtimeを持つすべての要素を除外しitems
(results
そして、フィルタリングされた数と合計サイズを追跡し)、異なるmtimeを持つアイテムまたはそうでないアイテムで新しいリストを作成することですに存在しresult
ます。(path,size,mtime_from_result,hash_from_result)
mtimeが異なるアイテムと、データベースになかったアイテムを保存する必要があります(path,size,mtime,None)
。
これをあまりローカライズしないようにしたいと思いますが、質問をするために何を達成しようとしているのかを説明する必要があると感じました。
問題
このループをできるだけ速くしたいのですが、最も重要なのは期待どおりに機能させることです。
アイテムを繰り返し処理するときに、リストからアイテムを削除しても安全ですか?前方への反復は奇妙な結果をもたらすことに気づきましたが、後方への反復は問題ないようです。より良いアプローチはありますか?
関係が1対1であり、再び一致しないことがわかっているため、一致したアイテム(i.path == j[0]
)を削除します。リストを減らすことで、次の反復でより速く反復でき、さらに重要なことに、すべての比類のないアイテムを残しました。
おそらくリスト内包表記やジェネレーターを使用して、私が見落としているはるかに優れたソリューションがあると感じずにはいられません。
send_items=[]
for i in result[::-1]:
for j in items[::-1]:
if i.path==j[0]:
result.remove(i) #I think this remove is possibly pointless?
items.remove(j)
if i.mtime==j[2]:
self.num_skipped+=1
self.size_skipped+=j[1]
else:
send_items.append((j[0],j[1],i.mtime,i.hash))
break
send_items.extend(((j[0],j[1],j[2],None) for j in items))