0

クラスがあるとします:

class x(obj):
    y = 1

より速い(または好ましい)もの:

    def __init__(self):
        print self.y

また:

    def __init__(self):
        print x.y

意図をよりよく伝えると思いx.yますが、速度への影響に興味があります。

4

2 に答える 2

3

これらのマイクロ最適化で達成できる可能性のあるパフォーマンスの向上は重要ではありません。printingの影響は、属性アクセスのコストをはるかに小さくします。参考までに、テスト スクリプトを次に示します。

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

これは、両方のバリアントが同一であるという実験誤差の範囲内です。大雑把な実験では、次のことが示されています。

  • 実行時間の約 90% は、実際に印刷結果を表示することによって発生します。
  • 残りの約 50% は、print ステートメントだけが占める時間です。
  • 残りの約 80% は、オブジェクトの割り当てが原因です

したがって、パフォーマンスに違いはないという結論を導き出すと言っても過言ではありません。

于 2012-07-19T11:04:33.710 に答える
0

クラスの実装によっては、戻り値が異なる場合があることに注意してください。

これにより、インスタンスの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は少し速くなるはずです。

于 2012-07-19T11:20:26.330 に答える