我有一个简单的代码来帮助我测量带有__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()
,会发生以下情况:
提前谢谢。在
请注意,如果我使用namedtuple
s,也会观察到相同的行为:
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)
直接回答标题中的问题:
__slots__
对于PyPy中的性能是没有意义的(但不会损害)。在在
timeit
代码的10000次左右的迭代中,都会从头开始重新创建类。在PyPy中,创建类可能不是一个很好的优化操作;更糟糕的是,这样做可能会放弃JIT在类的前一个具体化中所学的所有优化。PyPy在JIT预热之前往往比较慢,所以重复地做需要它预热的事情会影响您的性能。在当然,这里的解决方案是将类定义移到基准代码之外。在
相关问题 更多 >
编程相关推荐