[英]Fastest way to check if a object attribute is in a list, if yes do something and write it to output
我有一長串對象(> 1M),其中一個屬性需要與列表進行比較,如果它與列表元素之一匹配,我想添加另一個屬性並將 object 寫入文件。
到目前為止,我正在使用
mols_cons_2 = [mol for mol in mols_2 if mol.title in cons_mol]
for mol in mols_cons_2:
"add new attribute here"
out_2.write(mol)
其中mols_2
是對象列表, mol.title
是屬性,而mol.title
是比較cons_mol
的列表。 這樣,我必須同時閱讀mols_2
和mols_cons_2
,而我想在第一個循環中合並第二個循環(即如果mol
在mols_2
和mol.title
在cons_mol
中,添加新屬性並寫入out_2
。關於如何有效地做到這一點?
你想組合循環,對吧? 只需使用 if 語句作為過濾器:
for mol in mols_2:
if mol.title in cons_mol:
mol.new_attribute = 'eggs' # Example attribute add
out_2.write(mol)
這樣可以節省創建列表mols_cons_2
。
您提到要檢查超過 100 萬個元素,這意味着使用列表成員資格檢查將非常低效。
在 python 中執行此操作的一種快速方法是使用set
數據結構。 首先,使用您已有的列表創建一個集合。 然后使用in
進行會員檢查。 這比在list
中進行成員資格檢查要快,因為它只允許插入唯一元素。
attributes = [1, 2, 3]
attribute_set = set(attributes)
objects = [Obj1, Obj2]
for obj in objects:
if obj.title in attribute_set:
do_something()
out_2.write(mol)
以下是列表成員檢查和集合成員檢查之間的基准。
import timeit
target = [_ for _ in range(100000)]
s = set(target)
l = target
print("set membership check: ", timeit.timeit(lambda: 10001 in s))
print("list membership check: ", timeit.timeit(lambda: 10001 in l))
這是我機器上的結果。
set membership check: 0.06143619100021169
list membership check: 94.21448056700001
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.