0

我正在编写一个类,它多次使用几个非成员函数(所有返回列表)的结果。

我想知道处理这个问题的标准方法是什么——我最初的想法是写一些类似的东西:

class Y_and_Z_matrices(object):
    def __init__(self, roots_p, roots):
        self.deltas = deltas(roots)
        self.deltas_p = deltas(roots_p)
        self.thetas = thetas(roots)
        self.thetas_p = thetas_p(roots_p)
        self.epsilons = epsilons(roots)
        self.epsilons_p = epsilons(roots_p)


    def _func_a (self, roots_p, roots, param):
        #refers to the member variables

    def _func_b (self, roots_p, roots, param):
        #refers to the member variables

    def Ymatrix(self, roots_p, roots):
        #refers to the member variables

    def Zmatrix(self, roots_p, roots):
        #refers to member variables

我认为只调用一次而不是多次调用函数会更快,但是由于deltas,thetasepsilons函数都很小,我不确定它是否重要。

现在我想知道在这种情况下python是如何工作的,这是否比deltas在我将使用它们的每个函数中调用函数更好?保存列表roots并引用它们而不是将它们传递给许多函数会更好吗?

即重写上述内容的(缺点)优点是什么:

class Y_and_Z_matrices(object):
    def __init__ (self, roots_p, roots, param):
        self.roots_p = roots_p
        self.roots = roots
        self.param = param

    def _func_a (self):
        #uses 'roots_p', 'roots', and 'param' member variables
        #passes 'roots' and 'roots_p' to 'deltas', 'epsilons' and 'thetas' when needed

    def _func_b (self):
        #uses 'roots_p', 'roots', and 'param' member variables
        #passes 'roots' and 'roots_p' to 'deltas', 'epsilons' and 'thetas' when needed

    def Ymatrix(self):
        #uses 'roots_p', and 'roots' member variables
        #passes 'roots' and 'roots_p' to 'deltas', 'epsilons' and 'thetas' when needed

    def Zmatrix(self):
        #uses 'roots_p', and 'roots' member variables
        #passes 'roots' and 'roots_p' to 'deltas', 'epsilons' and 'thetas' when needed

我想以第二种方式编写类,但唯一的原因是因为我喜欢具有尽可能小的参数列表的函数的外观,而且我不喜欢我的__init__函数看起来如此笨拙。

总结一下这个问题:-

将函数的返回值保存为成员变量而不是在多个成员函数中调用函数,客观上是更好还是更差?

保存参数(在整个类中都是相同的)或使用所需参数调用函数客观上是更好还是更差?

或者

只是在某个地方(如果有,在哪里)有一个权衡吗?

4

1 回答 1

1

Python3 的最新版本对此有一个很好的解决方案:functools' lru_cache. 这个装饰器允许你让 Python 记住对特定参数组合的函数调用的结果(这假设如果使用相同的参数,所述函数的结果将是相同的)。

于 2013-02-04T13:58:31.657 回答