是否应该在每个字符串出现时明确调用实习生?

时间:2013-11-08 17:57:42

标签: python string-interning

假设我逐行读取文件并将行保存到列表中:

intern('abcd')
lst = []  
for line in f:
    lst.append(line)

并且文件有五条相同的行:

abcd
abcd
abcd
abcd
abcd

阅读完成后,内存中是否会有五份“abcd”或只有一份?

1 个答案:

答案 0 :(得分:2)

将有5份。 intern()调用返回字符串的一个副本,它并没有神奇地使所有未来的字符串具有相同的内容。

然而,我使用实习文件数据。实习字符串的最大优势在于性能关键部分,您需要尽可能快地进行字典查找。 Interning允许您在可以使用指针运算时跳过相等测试。

实习也有性能损失;每次调用intern()时,都会根据内部字典测试字符串,以查看字符串是否已被实习。这需要一个哈希调用和0个或更多个相等测试(如果字符串之前没有被中断并且没有哈希冲突,则为0,如果冲突则不止一个)。对于字符串中的每一行调用intern()将会因这些操作而变慢,并且只有当您有大量重复次数时我才不会想到内存收益将是如此之大。