gpt4 book ai didi

python 按键访问字典

转载 作者:太空宇宙 更新时间:2023-11-04 05:28:39 25 4
gpt4 key购买 nike

我使用自定义类的实例(类似于带有一堆额外内容的 2D 向量)作为字典键。
它使用自定义散列和等于魔术方法,基本上使其等于具有初始化数据的元组。

我正在处理的数据集非常大,内存 (RAM) 是一个主要问题,我需要多个不同的数据结构,并将相同的自定义对象实例作为键。

我想访问字典键的实际引用。

如果我可以从初始化数据的元组中获取一个字典键,我就可以防止不同的自定义类实例在不同的数据结构中使用相同的内部数据,而是使用相同的实例。

这可能吗?如果是,怎么办?

例子:

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"

结果我将节省几乎一半的内存。
这只是为了设置程序稍后使用的初始数据结构。

最佳答案

本质上,您想要做的是控制 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 作为缓存,以初始参数为键,但您可以根据您的性能要求将其调整为更合适的内容。

当您需要创建一个新的 key 来访问您的数据时,您可以使用工厂方法来获取 MyVect 实例。

keydata_without_reference = (1,5,"data",True)
mykey = MyVect.get_instance(*keydata_without_reference)
dict2[mykey] = "some other data"

在对方法和属性进行访问控制的语言中(如 C++、Java 等),您可以将类构造函数设置为 private,这将强制调用代码使用工厂方法来获取实例并避免任何问题。在 Python 中,这是不可能的,因此您必须小心不要直接调用构造函数。

关于python 按键访问字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37866845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com