PyPy int 优化是否适用于 int 的子类?

问题描述 投票:0回答:1

据我所知,PyPy 对 int 和列表等内置类型进行了特殊优化,这很棒,因为它们非常常见,并且像对待任何其他对象一样对待 int 会很浪费。

如果我专门对

int
进行子类化,例如

class bitset(int):
    def in_bit(self, i):
        return bool(self & (1 << i))

这些优化是否丢失了?我不想过早优化,但我也不想浪费,因为我可以轻松定义像

in_bit(b, i)
这样的函数,而不是其中
b
是一个普通的旧
int

python optimization subclass pypy
1个回答
0
投票

您需要检查生成的程序集以确定,但据我通过测量得知,答案是否定的:基本优化并没有丢失。您也不需要添加

__slots__ = ()
; PyPy 不使用它进行优化。 有所不同的地方是,如果您为子类创建了很多长期存在的实例(它们每个都占用一个额外的内存字,但前提是它们是长期存在的,否则无论如何都会跳过分配)。 还有一些特定的优化可能会丢失,例如仅包含(真实)整数的列表存储得更紧凑。 我无法给出完整的清单;一般来说,PyPy 解释器会假设真正的 int 对象比 int 的子类更常见,从而进行各种优化,但事实证明,PyPy 中的后续 JIT 可以在生成汇编程序时恢复一些缺失的优化。

© www.soinside.com 2019 - 2024. All rights reserved.