我需要對類對象進行多重比較。然而,只有選定字段的值都受到比較,即:類對象的選擇性比較
class Class:
def __init__(self, value1, value2, value3, dummy_value):
self.field1 = value1
self.field2 = value2
self.field3 = value3
self.irrelevant_field = dummy_value
obj1 = Class(1, 2, 3, 'a')
obj2 = Class(1, 2, 3, 'b') #compare(obj1, obj2) = True
obj3 = Class(1, 2, 4, 'a') #compare(obj1, obj3) = False
目前我做這種方式:
def dumm_compare(obj1, obj2):
if obj1.field1 != obj2.field1:
return False
if obj1.field2 != obj2.field2:
return False
if obj1.field3 != obj2.field3:
return False
return True
至於我的實際相關領域的數大於10,這種方法會導致到相當龐大的代碼。這就是爲什麼我嘗試這樣的事情:
def cute_compare(obj1, obj2):
for field in filter(lambda x: x.startswith('field'), dir(obj1)):
if getattr(obj1, field) != getattr(obj2, field):
return False
return True
該代碼是緊湊的;然而,性能遭受重大損失:
import time
starttime = time.time()
for i in range(100000):
dumm_compare(obj1, obj2)
print('Dumm compare runtime: {:.3f} s'.format(time.time() - starttime))
starttime = time.time()
for i in range(100000):
cute_compare(obj1, obj2)
print('Cute compare runtime: {:.3f} s'.format(time.time() - start time))
#Dumm compare runtime: 0.046 s
#Cute compare runtime: 1.603 s
是否有辦法更有效地實現選擇性對象比較?其實我需要幾個這樣的函數(它們通過不同的,有時重疊的字段集來比較對象)。這就是爲什麼我不想覆蓋內置的類方法。
您是否事先知道有多少個田地? –
明確應該*應與*進行比較的字段比較快速,例如使用類屬性COMPARE_FIELDS = ['field1','field2',...]',然後遍歷它。 – jonrsharpe