我遇到了关于字典内存管理的这个问题,它提到了intern函数。它确切地是做什么的?在什么情况下会使用它?
举个例子:如果我有一个名为seen的集合,其中包含形式为(string1,string2)的元组,我用它来检查重复项,那么存储(intern(string1),intern(string2))是否会提高内存或速度方面的性能?
来自 Python 3 文档:
sys.intern(string)
如果字符串不存在(尚未被内部化),该函数会将其保存在表中,并从内部化的字符串表中返回它。
>>> import sys
>>> a = sys.intern('why do pangolins dream of quiche')
>>> a
'why do pangolins dream of quiche'
在上面的示例中,a
保存了内部化的字符串。即使它不可见,sys.intern
函数也已将 'why do pangolins dream of quiche'
字符串对象保存在内部化的字符串表中。
如果字符串存在(已经被内部化),该函数会从内部化的字符串表中返回它。
>>> b = sys.intern('why do pangolins dream of quiche')
>>> b
'why do pangolins dream of quiche'
即使它不是立即可见的,因为字符串 'why do pangolins dream of quiche'
已经被内部化,b
现在保存的是与 a
相同的字符串对象。
>>> b is a
True
如果我们创建相同的字符串但没有使用内部化,我们最终会得到两个具有相同值的不同字符串对象。
>>> c = 'why do pangolins dream of quiche'
>>> c is a
False
>>> c is b
False
sys.intern
,您可以确保不会创建两个具有相同值的字符串对象——当您请求创建一个与现有字符串对象具有相同值的第二个字符串对象时,您将收到对预先存在的字符串对象的引用。这样,您就可以节省内存。此外,字符串对象比较现在非常高效,因为它是通过比较两个字符串对象的内存地址而不是它们的内容来进行的。.py
文件中编写代码并运行它,我们会得到c is a
的结果为True
。为什么会这样呢? - Shashank Singh实质上,intern 函数会在一个 interned 字符串集合中查找(或存储,如果不存在)该字符串,因此所有 interned 实例都将共享相同的标识。你可以通过一次查找字符串来换取更快的比较速度(只需检查标识即可返回 True,而不必比较每个字符),并减少内存使用。
然而,Python 会自动intern小型字符串或看起来像标识符的字符串,因此您可能会发现没有任何改进,因为您的字符串已经在后台进行了 intern 处理。例如:
>>> a = 'abc'; b = 'abc'
>>> a is b
True
他们没有谈论Python中的关键字intern
,因为这个关键字在Python中并不存在。他们正在谈论非必要内置函数intern
,该函数在py3k中已经被移动到sys.intern
中。文档中有详尽的描述。
它返回字符串的规范实例。
因此,如果您有许多相等的字符串实例,则可以节省内存,并且还可以通过标识比较规范化的字符串而不是相等性,这样更快。