我使用自定义类的实例(类似于带有一堆额外东西的2D向量)作为dict键。
它使用自定义散列和等于魔术方法,基本上使它等于具有初始化数据的元组。
我处理的数据集非常大,以至于内存(RAM)是一个主要问题,我需要多个不同的数据结构,其中自定义对象实例与键相同。
我想访问dict键的实际引用。
如果我可以从初始化数据的元组中获取dict键,我可以防止不同的自定义类实例在不同的数据结构中使用相同的内部数据,而是使用相同的实例。
这可能吗?如果是,怎么样?
示例:
dict1 = {}
dict2 = {}
一个代码段:
v = MyVect(1,5,"data",True)
dict1[v] = ("important", "data")
第二部分:
(此部分只能访问用于创建MyVect
但没有实际参考的数据。)
keydata_without_reference = (1,5,"data",True)
mykey = dict1.getkeyref(keydata_without_reference) # getkeyref somehow
dict2[mykey] = "some other data"
结果我几乎可以节省一半的内存 这只是为了设置程序稍后使用的初始数据结构。
答案 0 :(得分:1)
基本上,您要做的是控制MyVect
实例的创建,以便对于给定的初始化数据集,只创建一个MyVect
实例。
我建议使用Factory method pattern作为MyVect
类的静态方法实现,它将跟踪已创建的类的所有实例。
class MyVect(object):
instances = {}
@staticmethod
def get_instance(*args):
instance = MyVect.instances.get(args)
if instance is None:
MyVect.instances[args] = instance = MyVect(*args)
return instance
def __init__(*args):
# Memory intensive initialization here
我建议将工厂方法签名与类构造函数的签名匹配。我也使用一个简单的dict作为缓存,用初始参数键入,但你可以根据你的性能要求调整它,使其更合适。
如果需要创建新密钥来访问数据,可以使用工厂方法获取MyVect
实例。
keydata_without_reference = (1,5,"data",True)
mykey = MyVect.get_instance(*keydata_without_reference)
dict2[mykey] = "some other data"
在对方法和属性(如C ++,Java等)具有访问控制的语言中,您可以将类构造函数设置为 private ,这将强制调用代码使用工厂方法获取实例并避免任何问题。在Python中,这是不可能的,所以你必须小心不要直接调用构造函数。