I'm in the process of converting a large legacy app from Django 1.5 to 1.7. 
I've got all the tests passing, so I'm researching an issue I noticed 
during the course of my work: Test startup takes MUCH longer under Django 
1.7 than it did under 1.5. I've got a test that, when run by itself, took a 
total of 5 seconds under 1.5. Under 1.7 it takes over a minute.

To isolate the test startup, I setup a do-nothing test method within a 
subclass of django.test.TestCase. I ran it under Django 1.5 and 1.7 with 
similar results to the existing "real" test.

I ran the do-nothing test within cProfile under Django 1.7 and found 
something very interesting. According to pstats, the method 
django.apps.config.AppConfig.get_models() was called 2.2+ MILLION times. 
Even with 79 django apps in my INSTALLED_APPS setting, that seems excessive.

I read the Django 1.7 release notes, especially the App Config stuff. I 
noticed the warning about not importing models in the application root 
module. I went through all of our internal apps and made sure they were not 
importing models in the root module. I had to make some changes, moving 
imports inside functions/methods. I also looked at my third-party 
dependency apps. None of those were importing their models in their root 
modules.

After all that, though, I still see no change in behavior.

I thought I might have some loop happening somewhere, though why it wasn't 
infinite was interesting. It would be nice to know more about the context 
of those get_models() calls. Perhaps I had a couple of mis-behaving apps 
locked in a deadly embrace of some sort.

I hacked on my locally installed django.apps.config.AppConfig class, adding 
a class-level collections.Counter that gets incremented for self.label by 
the get_models() method.
I dumped the results to a json file within my do-nothing test. It wouldn't 
be comprehensive, but at least it would show me what had happened before 
the test ran.

I expected to see a few big numbers and a lot of small ones. As often 
happens when profiling, my expectations were completely wrong. All the 
counts were very similar, all in the 6000-7999 range. All 79 of my apps 
were represented.

Is there some sort of cartesian product going on here?

Is this behavior normal and expected?

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/4c698390-e8e2-437e-ae74-34c796986275%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to