[Python-Dev] Startup time (original) (raw)

Skip Montanaro skip@pobox.com
Fri, 16 May 2003 14:00:24 -0500


mal> FWIW, I've removed the re usage from encodings/__init__.py.

mal> Could you check whether this makes a difference in startup time
mal> now?

Well... Not really, but it's not your fault. site.py imports distutils.util which imports re. It does a fair amount of regex compiling, some at the module level, so deferring "import re" may take a couple minutes of work. Hang on...

Okay, now re isn't imported. The only runtime difference between the two sets of times below is encodings/init.py 1.18 vs 1.19. Each set of times is for this command:

% time ./python.exe -c pass

Everything was already byte compiled. The times reported were the best of five. I tried to quiet the system as much as possible. Still, since the amount of work being done is minimal, it's tought to get a good feel for any differences.

version 1.18 (w/ re)

real    0m0.143s
user    0m0.030s
sys     0m0.060s

version 1.19 (no re)

real    0m0.142s
user    0m0.040s
sys     0m0.060s

Note the rather conspicuous lack of any difference. The only modifications to my Lib tree are these:

M cgitb.py
M warnings.py
M distutils/util.py
M encodings/__init__.py
M test/test_bsddb185.py

I verified that site was imported from my Lib tree:

% ./python.exe -v -c pass 2>&1 | egrep 'site'
# /Users/skip/src/python/head/dist/src/build.opt/../Lib/site.pyc matches /Users/skip/src/python/head/dist/src/build.opt/../Lib/site.py
import site # precompiled from /Users/skip/src/python/head/dist/src/build.opt/../Lib/site.pyc
# cleanup[1] site

It would appear that the encodings stuff isn't getting imported on my platform (Mac OS X):

% ./python.exe -v -c pass 2>&1 | egrep 'encoding'
%

Looking at site.py shows that the encodings package is only imported on win32 and only if the codecs.lookup() call fails. Oh well, we don't care about minority platforms. ;-) More seriously, to test your specific change someone will have to run the check Windows.

To contribute something maybe positive, here's the same timing comparison using my changed version of distutils.util vs CVS:

CVS:

real    0m0.155s
user    0m0.050s
sys     0m0.070s

Changed (no module-level re import):

real    0m0.143s
user    0m0.070s
sys     0m0.040s

It appears eliminating "import re" has only a very small effect for me. It looks like an extra 6 modules are imported (25 vs 19).

Skip