/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to profile_imports.py

  • Committer: Marius Kruger
  • Date: 2010-07-10 21:28:56 UTC
  • mto: (5384.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 5385.
  • Revision ID: marius.kruger@enerweb.co.za-20100710212856-uq4ji3go0u5se7hx
* Update documentation
* add NEWS

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
"""A custom importer and regex compiler which logs time spent."""
19
19
 
20
 
from __future__ import absolute_import
21
 
 
22
 
import re
23
20
import sys
24
21
import time
25
22
 
26
23
 
 
24
if sys.version_info < (2, 5, 0):
 
25
    import sre
 
26
    re = sre
 
27
else:
 
28
    import re
 
29
 
 
30
 
27
31
_parent_stack = []
28
32
_total_stack = {}
29
33
_info = {}
43
47
        _total_stack[_parent_stack[-1]].append(this_stack)
44
48
    _total_stack[this_stack] = []
45
49
    _parent_stack.append(this_stack)
46
 
    _info[this_stack] = [len(_parent_stack) - 1, frame_name, frame_lineno,
47
 
                         scope_name]
 
50
    _info[this_stack] = [len(_parent_stack)-1, frame_name, frame_lineno, scope_name]
48
51
 
49
52
    return this_stack
50
53
 
61
64
 
62
65
def log_stack_info(out_file, sorted=True, hide_fast=True):
63
66
    # Find all of the roots with import = 0
64
 
    out_file.write(
65
 
        '%5s %5s %-40s @ %s:%s\n'
66
 
        % ('cum', 'local', 'name', 'file', 'line'))
67
 
    todo = [(value[-1], key) for key, value in _info.items() if value[0] == 0]
 
67
    out_file.write('%5s %5s %-40s @ %s:%s\n'
 
68
        % ('cum', 'inline', 'name', 'file', 'line'))
 
69
    todo = [(value[-1], key) for key,value in _info.iteritems() if value[0] == 0]
68
70
 
69
71
    if sorted:
70
72
        todo.sort()
88
90
 
89
91
        # indent, cum_time, mod_time, name,
90
92
        # scope_name, frame_name, frame_lineno
91
 
        out_file.write(
92
 
            '%5.1f %5.1f %-40s @ %s:%d\n' % (
93
 
                info[-1] * 1000., mod_time * 1000.,
94
 
                ('+' * info[0] + cur[1]), info[1], info[2]))
 
93
        out_file.write('%5.1f %5.1f %-40s @ %s:%d\n'
 
94
            % (info[-1]*1000., mod_time*1000.,
 
95
               ('+'*info[0] + cur[1]),
 
96
               info[1], info[2]))
95
97
 
96
98
        if sorted:
97
99
            c_times.sort()
102
104
 
103
105
_real_import = __import__
104
106
 
105
 
def timed_import(name, globals=None, locals=None, fromlist=None, level=0):
 
107
def timed_import(name, globals=None, locals=None, fromlist=None, level=None):
106
108
    """Wrap around standard importer to log import time"""
107
109
    # normally there are 4, but if this is called as __import__ eg by
108
110
    # /usr/lib/python2.6/email/__init__.py then there may be only one
109
111
    # parameter
110
 
    # level has different default between Python 2 and 3, but codebase
111
 
    # uses `from __future__ import absolute_import` so can just use 0.
 
112
    # level is only passed by python2.6
112
113
 
113
114
    if globals is None:
114
115
        # can't determine the scope name afaics; we could peek up the stack to
121
122
        if scope_name is None:
122
123
            scope_name = globals.keys()
123
124
        else:
124
 
            # Trim out paths before breezy
125
 
            loc = scope_name.find('breezy')
 
125
            # Trim out paths before bzrlib
 
126
            loc = scope_name.find('bzrlib')
 
127
            if loc != -1:
 
128
                scope_name = scope_name[loc:]
 
129
            # For stdlib, trim out early paths
 
130
            loc = scope_name.find('python2.4')
126
131
            if loc != -1:
127
132
                scope_name = scope_name[loc:]
128
133
 
149
154
    tstart = _timer()
150
155
    try:
151
156
        # Do the import
152
 
        return _real_import(name, globals, locals, fromlist, level=level)
 
157
        mod = _real_import(name, globals, locals, fromlist)
153
158
    finally:
154
 
        tload = _timer() - tstart
 
159
        tload = _timer()-tstart
155
160
        stack_finish(this, tload)
156
161
 
157
 
 
158
 
def _repr_regexp(pattern, max_len=30):
159
 
    """Present regexp pattern for logging, truncating if over max_len."""
160
 
    if len(pattern) > max_len:
161
 
        return repr(pattern[:max_len - 3]) + "..."
162
 
    return repr(pattern)
 
162
    return mod
163
163
 
164
164
 
165
165
_real_compile = re._compile
179
179
        frame = sys._getframe(5)
180
180
        frame_name = frame.f_globals.get('__name__', '<unknown>')
181
181
    frame_lineno = frame.f_lineno
182
 
    this = stack_add(extra + _repr_regexp(args[0]), frame_name, frame_lineno)
 
182
    this = stack_add(extra+repr(args[0]), frame_name, frame_lineno)
183
183
 
184
184
    tstart = _timer()
185
185
    try:
202
202
    """Remove the import and regex compile timing hooks."""
203
203
    __builtins__['__import__'] = _real_import
204
204
    re._compile = _real_compile
 
205