/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: 2017-05-21 12:41:27 UTC
  • mto: This revision was merged to the branch mainline in revision 6623.
  • Revision ID: jelmer@jelmer.uk-20170521124127-iv8etg0vwymyai6y
s/bzr/brz/ in apport config.

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
21
20
import sys
22
21
import time
23
22
 
24
23
 
 
24
import re
 
25
 
 
26
 
25
27
_parent_stack = []
26
28
_total_stack = {}
27
29
_info = {}
41
43
        _total_stack[_parent_stack[-1]].append(this_stack)
42
44
    _total_stack[this_stack] = []
43
45
    _parent_stack.append(this_stack)
44
 
    _info[this_stack] = [len(_parent_stack) - 1, frame_name, frame_lineno,
45
 
                         scope_name]
 
46
    _info[this_stack] = [len(_parent_stack)-1, frame_name, frame_lineno, scope_name]
46
47
 
47
48
    return this_stack
48
49
 
59
60
 
60
61
def log_stack_info(out_file, sorted=True, hide_fast=True):
61
62
    # Find all of the roots with import = 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]
 
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]
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(
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]))
 
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]))
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=0):
 
103
def timed_import(name, globals=None, locals=None, fromlist=None, level=None):
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 has different default between Python 2 and 3, but codebase
 
108
    # level is only passed by python2.6
 
109
 
109
110
    if globals is None:
110
111
        # can't determine the scope name afaics; we could peek up the stack to
111
112
        # see where this is being called from, but it should be a rare case.
117
118
        if scope_name is None:
118
119
            scope_name = globals.keys()
119
120
        else:
120
 
            # Trim out paths before breezy
121
 
            loc = scope_name.find('breezy')
 
121
            # Trim out paths before brzlib
 
122
            loc = scope_name.find('brzlib')
 
123
            if loc != -1:
 
124
                scope_name = scope_name[loc:]
 
125
            # For stdlib, trim out early paths
 
126
            loc = scope_name.find('python2.4')
122
127
            if loc != -1:
123
128
                scope_name = scope_name[loc:]
124
129
 
145
150
    tstart = _timer()
146
151
    try:
147
152
        # Do the import
148
 
        return _real_import(name, globals, locals, fromlist, level=level)
 
153
        mod = _real_import(name, globals, locals, fromlist)
149
154
    finally:
150
 
        tload = _timer() - tstart
 
155
        tload = _timer()-tstart
151
156
        stack_finish(this, tload)
152
157
 
153
 
 
154
 
def _repr_regexp(pattern, max_len=30):
155
 
    """Present regexp pattern for logging, truncating if over max_len."""
156
 
    if len(pattern) > max_len:
157
 
        return repr(pattern[:max_len - 3]) + "..."
158
 
    return repr(pattern)
 
158
    return mod
159
159
 
160
160
 
161
161
_real_compile = re._compile
175
175
        frame = sys._getframe(5)
176
176
        frame_name = frame.f_globals.get('__name__', '<unknown>')
177
177
    frame_lineno = frame.f_lineno
178
 
    this = stack_add(extra + _repr_regexp(args[0]), frame_name, frame_lineno)
 
178
    this = stack_add(extra+repr(args[0]), frame_name, frame_lineno)
179
179
 
180
180
    tstart = _timer()
181
181
    try:
198
198
    """Remove the import and regex compile timing hooks."""
199
199
    __builtins__['__import__'] = _real_import
200
200
    re._compile = _real_compile
 
201