Правильное использование GAE ndb.ComputedProperty

У меня есть класс видео в моем проекте GAE, и я хочу иметь возможность искать по их оценке, которая представляет собой вычитание положительных голосов против отрицательных. Я хочу иметь возможность запросить это значение и получить его наиболее эффективным способом. Я считаю, что получение с вычисляемым свойством - лучший способ следующим образом:

class Video(ndb.Model):
    title = ndb.StringProperty(required = True)
    description = ndb.TextProperty()

    upvotes = ndb.IntegerProperty(required = True)
    downvotes = ndb.IntegerProperty(required = True)
    score = ndb.ComputedProperty(lambda self: self.upvotes - self.downvotes)

Мне было любопытно, есть ли у ComputedProperty проблемы с производительностью? Было бы более эффективно просто добавлять или вычитать значение оценки каждый раз, когда дается голос за или против?


person clifgray    schedule 26.07.2013    source источник
comment
это не lambda self ?   -  person Avinash Raj    schedule 14.03.2017


Ответы (1)


Для простых вычислений (таких как в вашем примере) не должно быть большого сопротивления производительности. Да, вычисление выполняется всякий раз, когда вы читаете данные, но в первую очередь при построении набора результатов требуется гораздо больше логики; одно вычитание ни на что не повлияет.

Да, для более сложных расчетов может быть снижение производительности.

person Amber    schedule 26.07.2013
comment
Хорошо, спасибо, это гораздо более чистое решение для меня, поэтому я надеялся, что все в порядке. - person clifgray; 27.07.2013
comment
Небольшое исправление: вычисляемое свойство запускается только при записи, а не при чтении. cloud.google.com/appengine/docs/python/ndb/properties# вычислено - person Rob Curtis; 19.09.2015
comment
@RobCurtis, это неправильно. сохраненное значение игнорируется, когда сущность считывается из хранилища данных; скорее, значение пересчитывается путем вызова функции всякий раз, когда запрашивается значение - person Amber; 20.09.2015
comment
@Amber, а, понятно, я слишком много внимания уделял Предупреждению: ComputedProperties вычисляются не по запросу, а по методу put(), но теперь я вижу, что это еще не все. Спасибо за исправление! - person Rob Curtis; 20.09.2015