2010-06-06 1 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 дает мне время, проведенное внутри суммы, и переформатируйте. Знают ли эти цифры что-то еще? Оба они сообщаются как довольно быстро. –

+0

@ Джон, я думаю, 'cProfile' развился с тех пор, как я в последний раз его использовал и изучил его, но я не вижу другого объяснения - помимо вызовов других функций, эти два метода действительно очень мало. –

1

Ваш «много часов» может быть лучше потрачен, делая ваш код менее похожим на лабиринт извилистых маленьких проходов, а также документируя его.

Аргументпервого метода не используется.

Тогда p = params(self.p,self.parents), но p НЕ ИСПОЛЬЗУЕТСЯ.

variable is self ???

__builtin__.sum ???

Получите это, во-первых, понятным, во-вторых, правильным. Тогда и только тогда, беспокойтесь о скорости.

+0

Ха-ха, справедливая критика. Этот код искажен, потому что я удалил некоторый код, пытаясь выяснить, что происходит. Я должен был бы, вероятно, вынести дополнительный параметр, но «переменная - это я», и необходимо использовать встроенную сумму. но не использование p было ошибкой, спасибо! –

Смежные вопросы