簡體   English   中英

在PyPy下使用__slots__

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM