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

时间:2009-07-16 10:57:01

标签: python memory memory-management python-3.x

我遇到了关于字典内存管理的this question,其中提到了实习生功能。它究竟做了什么,何时使用?

举个例子:

如果我有一个名为 see 的集合,其中包含形式(string1,string2)中的元组,我用它来检查重复项,将存储(intern(string1),intern(string2) )提高性能wrt记忆还是速度?

5 个答案:

答案 0 :(得分:59)

来自Python 3文档

sys.intern(string)
  

在“interned”字符串表中输入字符串并返回   interned string - 字符串本身或副本。实习字符串   有用的是在字典查找上获得一点性能 - 如果   字典中的密钥被中断,查找密钥被中断,   密钥比较(散列后)可以通过指针比较来完成   而不是字符串比较。通常,Python中使用的名称   程序自动实习,字典用于保存   模块,类或实例属性具有实习键。

     

实习字符串不是不朽的;你必须保留一个参考   返回intern()的值,从中受益。

澄清

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

sys.intern函数维护一个 interned 字符串表。当您尝试实习字符串时,该函数会在表格中查找它:

  1. 如果字符串不存在(尚未实习),则保存该功能 它在表中并从实习字符串表中返回。

    >>> 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'字符串对象保存在实习字符串表中。

  2. 如果字符串存在(已被实习),则该函数将从中返回 实习字符串表。

    >>> 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
    
  3. 通过使用sys.intern,您确保永远不会创建具有相同值的两个字符串对象 - 当您请求创建与现有字符串对象具有相同值的第二个字符串对象时,您会收到对预先存在的字符串对象。这样,您就节省内存。此外,字符串对象比较现在非常高效,因为它是通过比较两个字符串对象的内存地址而不是它们的内容来执行的。

答案 1 :(得分:17)

实际上,实习生在实习字符串集合中查找(或存储,如果不存在)字符串,因此所有实例化实例将共享相同的标识。您交换查找此字符串的一次性成本以进行更快的比较(比较可以在检查身份后返回True,而不是必须比较每个字符),并减少内存使用。

然而,python会automatically intern strings that are small, or look like identifiers,所以你可能会发现你没有得到任何改进,因为你的字符串已经在幕后被实习。例如:

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

在过去,一个缺点是实习字符串是永久性的。一旦被实现,即使在删除所有引用之后,字符串内存也从未被释放。我认为现在不再是更新版python的情况了。

答案 2 :(得分:11)

他们没有谈论关键字intern,因为Python中没有这样的东西。他们在谈论non-essential built-in function intern。在py3k中已将其移至sys.intern。文档有详尽的描述。

答案 3 :(得分:4)

它返回字符串的规范实例。

因此,如果您有许多相等的字符串实例,则可以节省内存,此外,您还可以按标识比较规范化字符串,而不是更快的等式。

答案 4 :(得分:-2)

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

String Interning