我花了很多时间试图弄清楚这里发生了什么。
下面代码中的函数'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
答案 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
...
首先要理解它,其次是正确的。然后,只有这样,担心速度。