我需要对类对象进行多重比较。然而,只有选定字段的值都受到比较,即:类对象的选择性比较
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