簡體   English   中英

檢查 object 屬性是否在列表中的最快方法,如果是,則執行某些操作並將其寫入 output

[英]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_2mols_cons_2 ,而我想在第一個循環中合並第二個循環(即如果molmols_2mol.titlecons_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM