在PyPy下使用Uu插槽

2024-06-16 08:55:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的代码来帮助我测量带有__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下运行代码(对于macos/X使用2.2.1-64位),它将开始使用100%的CPU并且“从不”返回(等待几分钟-没有结果)。在

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

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

^{pr2}$

提前谢谢。在


请注意,如果我使用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)

Tags: 代码infromtestimportselfobjfor
2条回答

直接回答标题中的问题:__slots__对于PyPy中的性能是没有意义的(但不会损害)。在

timeit代码的10000次左右的迭代中,都会从头开始重新创建类。在PyPy中,创建类可能不是一个很好的优化操作;更糟糕的是,这样做可能会放弃JIT在类的前一个具体化中所学的所有优化。PyPy在JIT预热之前往往比较慢,所以重复地做需要它预热的事情会影响您的性能。在

当然,这里的解决方案是将类定义移到基准代码之外。在

相关问题 更多 >