Can I get a review of the branch?  25% performance improvement of
Model.__init__ in stock django seems worth landing. :)


On Wed, Jul 18, 2012 at 3:48 AM, Jeremy Dunck <jdu...@gmail.com> wrote:
> On Sun, Jul 15, 2012 at 11:07 AM, Jeremy Dunck <jdu...@gmail.com> wrote:
>>
>> That is indeed what I meant, but I think Anssi's probably right that
>> this belongs in contribute_to_class instead of a new adhoc thing in
>> ModelBase.__new__.
>>
>> I'll take a swing at making this change.
>>
>> Opened related ticket: https://code.djangoproject.com/ticket/18627
>
>
> OK, I have a very rough cut w/ all tests passing here:
> https://github.com/jdunck/django/tree/18627_pre_init
>
> I poked in a flag, sys.JDUNCK_NEW, which can be turned on/off for old
> and new implementation - this is poked in at django.__init__
>
> To test performance, using tests/test_sqlite modified with:
>
> INSTALLED_APPS = [
>     'regressiontests.model_fields'
> ]
>
> and
> DATABASES['default']['name'] = ':memory:'
>
> Testing the pre_init hook:
>
> timeit.Timer("""
> for i in names:
>     models.Person(name=i)
> """, """
> from django.core.management import call_command
> from regressiontests.model_fields import models
> call_command('syncdb')
> names = [str(i) for i in range(1000)]
> """).timeit(1000)
>
> Under the existing signal usage: 24.609718084335327
> Under the new approach avoiding signal usage: 18.074234008789062
>
> I'd expect post_init to be a smaller gain since the destination
> function has more overhead, but still a gain.
>
> Note that the pre_init and post_init signals are still fired -- it's
> just that django as-shipped won't use any listeners on them, so the
> Model.__init__ performance improves.
>
> In some cases, object construction currently is larger than query time
> - a simple 'select x from y limit 1000' would have similar overhead to
> this.  Also, note that this gain would be seen on all models in any
> project using GFK or ImageField but no other pre_init or post_init
> hooks - not just those models which have the fields.  With this
> switch, only the models with the hooking fields have the related
> overhead.
>
> Feedback welcome.

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-developers@googlegroups.com.
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en.

Reply via email to