クラスがあるとします:
class x(obj):
y = 1
より速い(または好ましい)もの:
def __init__(self):
print self.y
また:
def __init__(self):
print x.y
意図をよりよく伝えると思いx.y
ますが、速度への影響に興味があります。
クラスがあるとします:
class x(obj):
y = 1
より速い(または好ましい)もの:
def __init__(self):
print self.y
また:
def __init__(self):
print x.y
意図をよりよく伝えると思いx.y
ますが、速度への影響に興味があります。
これらのマイクロ最適化で達成できる可能性のあるパフォーマンスの向上は重要ではありません。print
ingの影響は、属性アクセスのコストをはるかに小さくします。参考までに、テスト スクリプトを次に示します。
import sys,timeit
class ClassAccess(object):
y = 1
def __init__(self):
print(ClassAccess.y)
class SelfAccess(object):
y = 1
def __init__(self):
print(self.y)
ca = timeit.timeit(ClassAccess, number=100000)
sa = timeit.timeit(SelfAccess, number=100000)
sys.stderr.write(str(ca) + "\n")
sys.stderr.write(str(sa) + "\n")
私のマシン(ヤクアケ端末を使用)では、これは出力されます
0.640013933182
0.628859043121
これは、両方のバリアントが同一であるという実験誤差の範囲内です。大雑把な実験では、次のことが示されています。
したがって、パフォーマンスに違いはないという結論を導き出すと言っても過言ではありません。
クラスの実装によっては、戻り値が異なる場合があることに注意してください。
これにより、インスタンスのy属性が返されます。
def __init__(self):
print self.y
これはクラスのy属性を返しますが:
def __init__(self):
print x.y
コンストラクターがy属性をオーバーライドする場合ala:
def __init__(self, y=None):
self.y = y
def print(self):
print self.y
戻り値は異なります。Pythonは、クラスinternatディクショナリをチェックする前に、yをチェックするインスタンス内部ディクショナリを検索します。したがって、インスタンスディクショナリの検索を回避するため、printxyは少し速くなるはずです。