Python:使用staticmethod实现嵌套类的性能问题

时间:2013-09-28 09:13:41

标签: python class nested static-methods

使用混合nested classes检查以下示例staticmethods实施的工作代码。

import time

class A:
    def __init__(self):
        time.sleep(0.1)

    def a1(self):
        print 'a1'

    @staticmethod
    def a2(): 
        print 'a2'

    class B:
        @staticmethod
        def b2():
            A.a2()         #fine.  
            A().a1()       #very bad solution, computation cost is high !!!

        @staticmethod
        def x():
            t = time.clock()
            for i in xrange(100):
                A.B.b2()
            print 'elapsed: %0.1fs'%(time.clock()-t)

用作:

A.B.x()

上述方法有效,但正如您可能注意到我们尝试从容器类A().a1()访问非静态方法a1的行A,计算成本也是如此高。我们在sleep初始化中A强调了这一点。所以你明白了,例如,在我们的工作中,它可能是任何耗时的初始化。因此,我们不相信在上述行中实例化类A是一个不错的选择。如何不在上面实例化A,但完成上述工作。上面的问题已在任何地方得到解答,但相关问题包括thisthat

修改
我们对why use it等建议不感兴趣。上面明确指出我们感兴趣的问题是如何改善这一行

A().a1()

就是这样。

根据Martijn Pieters提供的建议,按以下方式解决。由于展示了解决方法,我们接受了答案。

class B:
    @staticmethod
    def b2(Ai):
        A.a2()         #fine.
        if Ai is None: Ai = A()
        Ai.a1()        #now is fine.

    @staticmethod
    def x():
        t = time.clock()
        Ai = A()
        for i in xrange(100):
            A.B.b2(Ai=Ai)
        print 'elapsed: %0.1fs'%(time.clock()-t)

谢谢。

1 个答案:

答案 0 :(得分:2)

您的问题与静态方法或嵌套类无关。全局函数存在完全相同的问题

class A:
    def __init__(self):
        time.sleep(0.1)

    def a1(self):
        print 'a1'

def a2(): 
    print 'a2'

def b2():
    a2()  
    A().a1()

def x():
    t = time.clock()
    for i in xrange(100):
        b2()
    print 'elapsed: %0.1fs'%(time.clock()-t)

调用x()仍会导致在A()之外的循环中创建昂贵的b2()实例。

您需要设计一个用于创建A()的缓存策略。有太多的方法可以在这里总结,当然,关于重新使用A()的实例是否可以接受创建新实例的信息很少。

如果您想在A()中重复使用x() 的实例作为循环,那么将其作为可选参数传递:

def x():
    t = time.clock()
    instance = A()
    for i in xrange(100):
        b2(instance)
    print 'elapsed: %0.1fs'%(time.clock()-t)

def b2(instance=None):
    a2()
    if instance is None:
        instance = A()
    instance.a1()

现在,实例在函数x()的持续时间内被缓存。