【问题标题】:How to determine the number of interned strings in Python 2.7.5?如何确定 Python 2.7.5 中的实习字符串数量?
【发布时间】:2023-04-03 18:55:01
【问题描述】:

在早期版本的 Python 中(我不记得是哪个版本了),在任意内部字符串上调用 gc.get_referrers 可用于获取对 interned 字典的引用,然后可以查询其长度。

但这在 Python 2.7.5 中不再有效:gc.get_referrers(...) 在返回的列表中不再包含 interned 字典。

在 Python 2.7.5 中,还有其他方法可以确定实习字符串的数量吗?如果有,怎么做?

【问题讨论】:

  • 你为什么在乎?你想用这种低级别的特定于版本的黑客来完成什么?哦,是的,2.7.12 是当前版本,那么为什么您需要在超过 3 年的版本上提供这种级别的详细信息?我并不是要怀有敌意,但我无法理解为什么这永远很重要。
  • (a) 我关心,因为我有兴趣了解 Python 进程的内存使用情况,这是一个额外的数据点。 (b) 我对 Python 2.7.5 很感兴趣,因为这是我们在产品中使用的版本,尽管我怀疑 Python 2.7.12 中的答案是一样的。
  • 感谢您的回答。我从来没有花时间调查interned dict 的大小,因为我的应用程序中的(非文字)字符串总是更重要,所以确保我只有一个这些字符串的副本我消磨时间的地方。因此,我仍然很好奇你的目标是什么——如果你有你想要的信息,你会如何使用它?
  • 确实,我在这里要求的特定数据(实习字符串的数量)本身可能没有那么有用,但它是一个开始的地方。更有趣的是:实习字符串的总大小; interned 字典本身的大小;从别处引用的实习字符串的数量(和大小);仅从另一个地方引用的实习字符串的数量(和大小)。总之,这些有助于回答这个问题:我们是否通过不必要地插入字符串而浪费了大量内存。
  • 文档 (docs.python.org/2/library/…) 说实习字符串不是不朽的(从 2.3 开始),所以不应该有没有至少一个外部引用来保持它们活着的实习字符串。

标签:
python
string
string-interning