获取对 Python dict 键的引用

Dus*_*yte 4 python dictionary pool python-3.x

在 Python(3.7 及更高版本)中,我想获得对 dict key的引用。更准确地说,让我们d成为一个字典,其中键是字符串。在以下代码中, of 的值k可能存储在内存中的两个不同位置(一个由 dict 指向,另一个由 指向k),而 of 的值v仅存储在一个位置(由 dict 指向的位置) .

# d is a dict
# k is a string dynamically constructed, in particular not from iterating over d's keys
if k in d:
    v = d[k]
    # Now store k and v in other data structures
Run Code Online (Sandbox Code Playgroud)

就我而言,字典非常大,字符串键非常长。为了减少内存使用量,我想k用一个指向相应字符串的指针替换,d然后再存储k到其他数据结构中。有没有一种直接的方法可以做到这一点,即使用 dict 的键作为字符串池?

脚注:这似乎是过早的优化,也许确实如此,但作为一个老派的 C 程序员,我在晚上做“记忆技巧”时睡得更好。抛开玩笑,出于好奇,我真的很想知道答案,我确实要在 Raspberry Pi 上运行我的代码,并且可能会遇到内存问题。)

Jas*_*ijn 7

钥匙k从哪里来?它是由str.join, +, 切片另一个字符串bytes.decode等动态构造的吗?它是从文件中读取的还是从文件中读取的input()?你有没有从d某个时候的迭代中得到它?或者它是否源自源代码中某处的文字?

在最后两种情况下,您不必担心它,因为无论如何它都将是单个实例。

如果没有,你可以sys.intern用来实习你的钥匙。如果a == b那么sys.intern(a) is sys.intern(b)

另一种可能的解决方案,如果您可能想在某个时候对字符串进行垃圾收集,或者您想实习一些非字符串值,例如字符串元组,您可以执行以下操作:

# create this dictionary once after `d` has all the right keys
canonical_keys = {key: key for key in d}

k = canonical_keys.get(k, k) # use the same instance if possible
Run Code Online (Sandbox Code Playgroud)

我建议阅读Python 的数据模型