python sys.intern做什么,什么时候应该使用?

我遇到了这个关于词典memory management的问题 ,里面提到了实习function。 它究竟做了什么,什么时候使用?

举个例子:

如果我有一个名为看到 ,包含元组forms(string1,string2),我用来检查重复,将存储(内部(string1),内部(string2))提高性能和内存或速度?

从Python 3文档

sys.intern(string) 

在“interned”string的表格中inputstring,并返回string本身或一个副本。 实习string对于在字典查找中获得一些性能非常有用 – 如果字典中的密钥被实施,并且查找密钥被实施,那么可以通过指针比较而不是string比较来完成密钥比较(哈希后)。 通常情况下,Python程序中使用的名称是自动实现的,用于保存模块,类或实例属性的字典都有实际的密钥。

Internedstring不是不朽的; 你必须保持对intern()的返回值的引用,以从中受益。

澄清

如文档所示, sys.intern函数旨在用于性能优化

sys.intern函数维护一个sys.internstring表。 当您尝试实习一个string时,函数在表中查找它并:

  1. 如果string不存在(尚未被实施),则该函数将其保存在表中,并从实参string表中返回。

     >>> import sys >>> a = sys.intern('why do pangolins dream of quiche') >>> a 'why do pangolins dream of quiche' 

    在上面的例子中, a保存了被拦截的string。 即使它不可见, sys.intern函数已经在sys.intern strings表中保存了'why do pangolins dream of quiche' sys.intern 'why do pangolins dream of quiche'string对象。

  2. 如果string存在(已经被执行),则该函数将从interned strings表中返回该string。

     >>> b = sys.intern('why do pangolins dream of quiche') >>> b 'why do pangolins dream of quiche' 

    即使它不是立即可见的,因为string'why do pangolins dream of quiche'之前已经被实施,现在b拥有相同的string对象。

     >>> b is a True 

    如果我们不使用intern创build相同的string,我们会得到两个具有相同值的不同string对象。

     >>> c = 'why do pangolins dream of quiche' >>> c is a False >>> c is b False 

通过使用sys.intern您可以确保永远不会创build两个具有相同值的string对象 – 当您请求创build与现有string对象具有相同值的第二个string对象时,您会收到对预先存在的string的引用目的。 这样,你正在节省内存 。 此外,string对象比较现在是非常有效的,因为它是通过比较两个string对象的内存地址而不是它们的内容来执行的。

本质上来说,实习生在一个实习string的集合中查找(或存储,如果不存在的话)string,因此所有实习的实例将共享相同的身份。 您交换查找此string的一次性成本以进行更快的比较(比较可以在仅检查身份之后返回True,而不必比较每个字符),并减less内存使用量。

然而,python会自动实习一些很小的string,或者看起来像标识符 ,所以你可能会发现你没有任何改进,因为你的string已经在幕后实现了。 例如:

 >>> a = 'abc'; b = 'abc' >>> a is b True 

过去,一个缺点是,string是永久性的。 一旦被拦截,即使所有引用都被删除,string内存也不会被释放。 我认为这不再是更多的Python版本的情况。

他们不是在谈论关键字intern因为Python中没有这样的事情。 他们在谈论非必要的内置functionintern 。 在py3k中已经被移动到sys.intern 。 文档有详尽的描述。

它返回string的规范实例。

因此,如果有多个相同的string实例可以节省内存,并且还可以通过身份比较规范化的string,而不是比较快的相等。

这个想法似乎在我们身边有几种语言,包括Python,Java等

string实习