静かなる名辞

pythonとプログラミングのこと

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念


【python】__slots__は速度的にどうなのか

概要

 __slots__を使うとメモリをケチれるという話はよく見かけますが、属性アクセスの速度については話を聞かないので調べてみました。

実験コード

import timeit

class A_slots:
    __slots__ = ["a"]
    def __init__(self):
        self.a = 42

class A_attr:
    def __init__(self):
        self.a = 42

a_s = A_slots()
a_a = A_attr()

for a in [a_s, a_a]:
    print("{:.4f}".format(timeit.timeit(lambda : a.a)))

 大したことはやっていません。

結果

0.1026
0.1114

 何回かやっても__slots__に定義した方が1割ほど速いという結果になりました。でも10^6回やって0.1秒なので、ほとんど問題にならないかも。

おまけ

>>> import timeit
>>> timeit.timeit(lambda :None)
0.08125272499659332

 timeitだけでこれくらいの時間がかかるので、実質2~3倍くらいは速いことになります。