非常简单的python函数需要花费很长时间在函数而不是子函数

时间:2010-06-06 23:37:09

标签: python performance

我花了很多时间试图弄清楚这里发生了什么。

下面代码中的函数'grad_logp'在我的程序中被多次调用,而cProfile和runsnakerun可视化结果显示函数grad_logp在本地花费大约.00004s'本地'每次调用不在它调用的任何函数中函数'n'每次调用都会花费大约.00006s。这两次合起约占我关心的节目时间的30%。看起来这不是函数开销,因为其他python函数花费的时间少得多'本地'并且合并'grad_logp'和'n'不能使我的程序更快,但这两个函数的操作看起来相当简单。有没有人对可能发生的事情有任何建议?

我做过一些明显效率低下的事吗?我误解了cProfile的工作原理吗?

def grad_logp(self, variable, calculation_set ):

    p = params(self.p,self.parents)

    return self.n(variable, self.p)

def n (self, variable, p ):
    gradient = self.gg(variable, p)

    return np.reshape(gradient, np.shape(variable.value))
def gg(self, variable, p):
    if variable is self:

        gradient = self._grad_logps['x']( x = self.value,  **p)
    else:
        gradient = __builtin__.sum([self._pgradient(variable, parameter, value, p) for parameter, value in self.parents.iteritems()])

    return gradient

2 个答案:

答案 0 :(得分:3)

用C编码的函数不通过分析进行检测;因此,例如,在sum(您正在拼写__builtin__.sum)中花费的任何时间都将向其来电者收取费用。不确定np.reshape是什么,但如果是numpy.reshape,那么同样适用。{/ p>

答案 1 :(得分:1)

你的“许多小时”可能会更好地使你的代码不再像一个曲折的小段落的迷宫,也记录它。

第一种方法的arg calculation_set未被使用。

然后它p = params(self.p,self.parents),但p未被使用。

variable is self ...

__builtin__.sum ...

首先要理解它,其次是正确的。然后,只有这样,担心速度。