1 PyIntObject

  • 区分为小整形和大整形。内部使用 long 存储值。
  • 小整形的 PyIntObject 对象全部存储起来不释放。在_PyInt_Init 中初始化 small_ints 变量。
  • 整形数值使用 block_list 和 free_list 实现整形池。
  • 多个 block_list 之间地址使用 next 指针链接,这个指针平时没什么用,结束时销毁内存的时候用到。
  • 重点关注函数:fill_free_list, int_dealloc, PyInt_FromLong
  • int_dealloc 讲述了资源释放后如何处理池。 假设 5,4,3,2,1 有这样的布局(不考虑小数池) 当前 free_list 指向 5 的左边的位置,标记为 a。 1 位置标记为 b。 当 1 删除的时候, 首先将 b 的下一个位置标记为 a,然后设置 free_list 指向 b。 当新建数值 6 的时候,用的就是 b 的空间。此时,free_list 又指向 a 了。

2 PyStringObject

  • 字符串变量一旦分配,则不可改变。
  • 有共享机制
  • nullstring。
  • 字符池 characters[255 + 1]。
  • 字符串共享, static PyObject *interned。
  • 拼接的字符串越多,”+” 的效率比起 join 就越低。 “+”: string_concat join: string_join

3 PyListObject

  • 类似于 C++的 vector。
  • 切片时会做范围检查。
  • 拷贝时只是拷贝元素指针,这些指针其指向的内存并不会拷贝。
  • list.remove 是将元素一个个对比,直至查找到符合的元素,删除。

4 PyDictObject

  • C++ map 使用红黑树(平衡二元树)O(log2N), python 使用散列表 O(1)。
  • 搜索策略:lookdict, lookdict_string ???
  • PyDict_SetItem。