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

puf*_*ish 45 python memory memory-management python-3.x

我遇到了关于词典内存管理的问题,提到了实习功能.它究竟做了什么,何时使用?

举个例子:

如果我有一组称为看出,包含形式的元组(字符串1,字符串),我用它来检查重复,会存储(实习生(字符串1),实习生(字符串2))提高性能WRT内存或速度?

小智 63

Python 3文档:

sys.intern(string)
Run Code Online (Sandbox Code Playgroud)

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

实习字符串不是不朽的; 你必须保持对intern()的返回值的引用才能从中受益.

澄清:

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

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

  1. 如果字符串不存在(尚未实现),则该函数将其保存在表中并从实习字符串表中返回.

    >>> import sys
    >>> a = sys.intern('why do pangolins dream of quiche')
    >>> a
    'why do pangolins dream of quiche'
    
    Run Code Online (Sandbox Code Playgroud)

    在上面的例子中,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'
    
    Run Code Online (Sandbox Code Playgroud)

    即使它不是立即可见的,因为字符串'why do pangolins dream of quiche'之前已被实现过,b现在保持相同的字符串对象a.

    >>> b is a
    True
    
    Run Code Online (Sandbox Code Playgroud)

    如果我们在不使用实习生的情况下创建相同的字符串,我们最终会得到两个具有相同值的不同字符串对象.

    >>> c = 'why do pangolins dream of quiche'
    >>> c is a
    False
    >>> c is b
    False
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 如果我们将代码写入“.py”文件中并执行,我们会得到“c is a”为“True”。这是为什么? (3认同)
  • @ShashankSingh我的理解是,当将python文件编译成PYC文件时,它将在文件中创建一个常量列表,在这种情况下为字符串,并且在显示的所有位置而不是重新创建字符串时都引用了常量。因此,在读取文件时,所有将字符串'why do ...'分配给该字符串的相同实例的情况都会出现。 (2认同)

Bri*_*ian 18

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

但是,python会自动实现小的字符串或看起来像标识符,所以你可能会发现你没有得到任何改进,因为你的字符串已经在幕后实现了.例如:

>>> a = 'abc'; b = 'abc'
>>> a is b
True
Run Code Online (Sandbox Code Playgroud)

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

  • * CPython *将自动自动插入较小的字符串-这是一种实现行为,不能保证所有实现都正确(但可能如此)。 (3认同)
  • CPython会自动内插很小的字符串,但前提是它们是代码中的常量表达式,而不是在运行时创建的字符串。参见stackoverflow.com/questions/15541404/python-string-interning。 (2认同)

Sil*_*ost 11

他们不是在谈论关键字,intern因为在Python中没有这样的东西.他们谈论的是非必要的内置功能intern.py3k中的哪个被移动到了sys.intern.文档有详尽的描述.