获取对 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。
在 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。