This post is the beginning of a
KISS tag, a place where I will put all the "over complications" I find on codes that I work on, or even to comment on my own mistakes.
Today I was working on a Django reports app and I saw this code:
result = reduce(lambda x, y: x + y, \ [i.thing.price for i in \ ModelObject.objects.filter(created_at__gte=date)])
At the first look, specially because of the use of
reduce I thought it was a complicated issue to solve.
2 seconds after I realized.
Why using reduce for sum when Python already has the built in sum function?
result = sum([i.thing.price for i in ModelObject.objects.filter(created_at__gte=date)])
Well Python gives us powerful builtins so just use this!
The other problem here is the memory usage of the above solution, it will first get the objects list from filter() and after that it will iterate one by one, doing a field lookup to take the
price and return a new list with values to sum.
It can kill your server!
On this case things can be done in a better way! we are talking about Django! and even I am being a Django ORM hater I know that it has some cool things like this one:
Django ORM aggregations
from django.db.models import Count queryset = ModelObject.objects.filter(created_at__gte=date) aggregation = queryset.aggregate(price=Sum('thing__price')) result = aggregation.get('price', 0)
On the above code, the aggregation
Sum will translate in to a SQL command and the sum will be performed on the database side! much better
I really do not like the Django ORM syntax, also I hate the way I bind the objects, maybe because I am used to use the wonderful DAL I prefer to refer to data as data, I mean, data as Rows not data as objects. But in cases I am working with Django, I think the best is to use its powerful tools!
Keep It Simple Stupid!
comments powered by Disqus Go Top