gpt4 book ai didi

python - 在 PyPy 下使用 __slots__

转载 作者:太空狗 更新时间:2023-10-29 20:38:44 24 4
gpt4 key购买 nike

我有这个简单的代码可以帮助我测量带有 __slots__ 的类的执行情况(取自 here ):

import timeit

def test_slots():
class Obj(object):
__slots__ = ('i', 'l')

def __init__(self, i):
self.i = i
self.l = []

for i in xrange(1000):
Obj(i)

print timeit.Timer('test_slots()', 'from __main__ import test_slots').timeit(10000)

如果我通过 python2.7 运行它 - 我会得到大约 6 秒的结果 - 好的,它确实比没有插槽更快(并且内存效率更高)。

但是,如果我在 PyPy 下运行代码(使用 2.2.1 - Mac OS/X 的 64 位),它开始使用 100% CPU 并且“从不”返回(等待几分钟 - 没有结果)。

这是怎么回事?我应该在 PyPy 下使用 __slots__ 吗?

如果我将不同的数字传递给 timeit() 会发生以下情况:

timeit(10) - 0.067s
timeit(100) - 0.5s
timeit(1000) - 19.5s
timeit(10000) - ? (probably more than a Game of Thrones episode)

提前致谢。


请注意,如果我使用 namedtuples,会观察到相同的行为:

import collections
import timeit

def test_namedtuples():
Obj = collections.namedtuple('Obj', 'i l')

for i in xrange(1000):
Obj(i, [])

print timeit.Timer('test_namedtuples()', 'from __main__ import test_namedtuples').timeit(10000)

最佳答案

timeit 代码的 10,000 次左右的每次迭代中,类都是从头开始重新创建的。在 PyPy 中创建类可能不是一个优化好的操作;更糟糕的是,这样做可能会丢弃 JIT 了解的有关该类先前化身的所有优化。在 JIT 预热之前,PyPy 往往很慢,所以做一些需要它反复预热的事情会降低你的性能。

当然,这里的解决方案是将类定义简单地移到要进行基准测试的代码之外。

关于python - 在 PyPy 下使用 __slots__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23068076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com