获取对 Python 字典键的引用

Get reference to Python dict key

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

# 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

在我的例子中,字典很大,字符串键也很长。为了减少内存使用,我想在将 k 存储在其他数据结构中之前,将 k 替换为指向 d 使用的相应字符串的指针。有没有一种直接的方法可以做到这一点,即使用字典的键作为字符串池?

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

密钥 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

我建议阅读 Python's data model