据我所知,PyPy 对 int 和列表等内置类型进行了特殊优化,这很棒,因为它们非常常见,并且像对待任何其他对象一样对待 int 会很浪费。
如果我专门对
int
进行子类化,例如
class bitset(int):
def in_bit(self, i):
return bool(self & (1 << i))
这些优化是否丢失了?我不想过早优化,但我也不想浪费,因为我可以轻松定义像
in_bit(b, i)
这样的函数,而不是其中 b
是一个普通的旧 int
。
您需要检查生成的程序集以确定,但据我通过测量得知,答案是否定的:基本优化并没有丢失。您也不需要添加
__slots__ = ()
; PyPy 不使用它进行优化。 有所不同的地方是,如果您为子类创建了很多长期存在的实例(它们每个都占用一个额外的内存字,但前提是它们是长期存在的,否则无论如何都会跳过分配)。 还有一些特定的优化可能会丢失,例如仅包含(真实)整数的列表存储得更紧凑。 我无法给出完整的清单;一般来说,PyPy 解释器会假设真正的 int 对象比 int 的子类更常见,从而进行各种优化,但事实证明,PyPy 中的后续 JIT 可以在生成汇编程序时恢复一些缺失的优化。