[英]Using __slots__ under PyPy
我有一個簡單的代碼,可以幫助我衡量帶有__slots__
類的性能(從此處獲取 ):
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下運行代碼(對於Mac OS / X,使用2.2.1-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)
提前致謝。
請注意,如果使用namedtuple
則會觀察到相同的行為:
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
代碼的timeit
10,000次迭代中的每個迭代中,都從頭開始重新創建該類。 在PyPy中創建類可能不是一個優化的操作。 甚至更糟的是,這樣做可能會放棄JIT從該類的先前化身中學到的所有優化。 在JIT進行熱身之前,PyPy往往會變慢,因此重復執行需要它進行熱身的操作會降低您的性能。
當然,這里的解決方案是將類定義簡單地移到被基准測試的代碼之外。
要直接回答標題中的問題: __slots__
對於PyPy的性能毫無意義(但不會影響)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.