/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: Jelmer Vernooij
  • Date: 2020-03-22 01:35:14 UTC
  • mfrom: (7490.7.6 work)
  • mto: This revision was merged to the branch mainline in revision 7499.
  • Revision ID: jelmer@jelmer.uk-20200322013514-7vw1ntwho04rcuj3
merge lp:brz/3.1.

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
import re
20
21
import sys
21
22
import time
22
23
 
23
24
 
24
 
import re
25
 
 
26
 
 
27
25
_parent_stack = []
28
26
_total_stack = {}
29
27
_info = {}
43
41
        _total_stack[_parent_stack[-1]].append(this_stack)
44
42
    _total_stack[this_stack] = []
45
43
    _parent_stack.append(this_stack)
46
 
    _info[this_stack] = [len(_parent_stack)-1, frame_name, frame_lineno, scope_name]
 
44
    _info[this_stack] = [len(_parent_stack) - 1, frame_name, frame_lineno,
 
45
                         scope_name]
47
46
 
48
47
    return this_stack
49
48
 
60
59
 
61
60
def log_stack_info(out_file, sorted=True, hide_fast=True):
62
61
    # Find all of the roots with import = 0
63
 
    out_file.write('%5s %5s %-40s @ %s:%s\n'
64
 
        % ('cum', 'inline', 'name', 'file', 'line'))
65
 
    todo = [(value[-1], key) for key,value in _info.iteritems() if value[0] == 0]
 
62
    out_file.write(
 
63
        '%5s %5s %-40s @ %s:%s\n'
 
64
        % ('cum', 'local', 'name', 'file', 'line'))
 
65
    todo = [(value[-1], key) for key, value in _info.items() if value[0] == 0]
66
66
 
67
67
    if sorted:
68
68
        todo.sort()
86
86
 
87
87
        # indent, cum_time, mod_time, name,
88
88
        # scope_name, frame_name, frame_lineno
89
 
        out_file.write('%5.1f %5.1f %-40s @ %s:%d\n'
90
 
            % (info[-1]*1000., mod_time*1000.,
91
 
               ('+'*info[0] + cur[1]),
92
 
               info[1], info[2]))
 
89
        out_file.write(
 
90
            '%5.1f %5.1f %-40s @ %s:%d\n' % (
 
91
                info[-1] * 1000., mod_time * 1000.,
 
92
                ('+' * info[0] + cur[1]), info[1], info[2]))
93
93
 
94
94
        if sorted:
95
95
            c_times.sort()
100
100
 
101
101
_real_import = __import__
102
102
 
103
 
def timed_import(name, globals=None, locals=None, fromlist=None, level=-1):
 
103
def timed_import(name, globals=None, locals=None, fromlist=None, level=0):
104
104
    """Wrap around standard importer to log import time"""
105
105
    # normally there are 4, but if this is called as __import__ eg by
106
106
    # /usr/lib/python2.6/email/__init__.py then there may be only one
107
107
    # parameter
108
 
    # level is only passed by python2.6
109
 
 
 
108
    # level has different default between Python 2 and 3, but codebase
110
109
    if globals is None:
111
110
        # can't determine the scope name afaics; we could peek up the stack to
112
111
        # see where this is being called from, but it should be a rare case.
122
121
            loc = scope_name.find('breezy')
123
122
            if loc != -1:
124
123
                scope_name = scope_name[loc:]
125
 
            # For stdlib, trim out early paths
126
 
            loc = scope_name.find('python2.4')
127
 
            if loc != -1:
128
 
                scope_name = scope_name[loc:]
129
124
 
130
125
    # Figure out the frame that is doing the importing
131
126
    frame = sys._getframe(1)
152
147
        # Do the import
153
148
        return _real_import(name, globals, locals, fromlist, level=level)
154
149
    finally:
155
 
        tload = _timer()-tstart
 
150
        tload = _timer() - tstart
156
151
        stack_finish(this, tload)
157
152
 
158
153
 
159
154
def _repr_regexp(pattern, max_len=30):
160
155
    """Present regexp pattern for logging, truncating if over max_len."""
161
156
    if len(pattern) > max_len:
162
 
        return repr(pattern[:max_len-3]) + "..."
 
157
        return repr(pattern[:max_len - 3]) + "..."
163
158
    return repr(pattern)
164
159
 
165
160
 
180
175
        frame = sys._getframe(5)
181
176
        frame_name = frame.f_globals.get('__name__', '<unknown>')
182
177
    frame_lineno = frame.f_lineno
183
 
    this = stack_add(extra+_repr_regexp(args[0]), frame_name, frame_lineno)
 
178
    this = stack_add(extra + _repr_regexp(args[0]), frame_name, frame_lineno)
184
179
 
185
180
    tstart = _timer()
186
181
    try:
203
198
    """Remove the import and regex compile timing hooks."""
204
199
    __builtins__['__import__'] = _real_import
205
200
    re._compile = _real_compile
206