2010-06-06 22 views
1

我花了很多時間試圖弄清楚這裏發生了什麼。非常簡單的python函數花費很長時間在函數中而不是子函數

下面代碼中的函數'grad_logp'在我的程序中多次調用,cProfile和runnakerun可視化結果顯示函數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 

回答

3

用C語言編寫的函數沒有通過性能分析進行檢測;因此,例如,在sum(您正在拼寫__builtin__.sum)中花費的任何時間都將由其調用者收費。不知道np.reshape是什麼,但是如果它是numpy.reshape,那也是一樣。

+0

呵呵,cProfile給了我總共花費的時間,並重塑。這些數字是否意味着別的?他們都報道速度相當快。 – 2010-06-07 02:55:31

+0

@John,我想'cProfile'自從我上次使用並深入研究以來已有所發展,但我沒有看到任何其他解釋 - 除了調用其他函數外,這兩種方法確實非常少。 – 2010-06-07 03:48:05

1

你的「許多小時」可能會更好地使你的代碼變得像一段曲折的小段落的迷宮,並且記錄它。

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

然後它確實p = params(self.p,self.parents)p沒有使用。

variable is self ???

__builtin__.sum ???

得到它首先可以理解,其次是正確的。然後,只有這樣,擔心速度。

+0

哈哈,公平的批評。這段代碼被破壞了,因爲我已經刪除了一些代碼,試圖弄清楚發生了什麼。我應該也許已經拿出了額外的參數,但'可變是自我',並且使用內建和都是必要的。不使用p是一個錯誤,但是,謝謝! – 2010-06-07 02:51:59

相關問題