##// END OF EJS Templates
Remove cProfile fallback import, since it was added in Python2.5
Terry Davis -
Show More
@@ -1,1503 +1,1495 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Implementation of execution-related magic functions."""
2 """Implementation of execution-related magic functions."""
3
3
4 # Copyright (c) IPython Development Team.
4 # Copyright (c) IPython Development Team.
5 # Distributed under the terms of the Modified BSD License.
5 # Distributed under the terms of the Modified BSD License.
6
6
7
7
8 import ast
8 import ast
9 import bdb
9 import bdb
10 import builtins as builtin_mod
10 import builtins as builtin_mod
11 import gc
11 import gc
12 import itertools
12 import itertools
13 import os
13 import os
14 import shlex
14 import shlex
15 import sys
15 import sys
16 import time
16 import time
17 import timeit
17 import timeit
18 import math
18 import math
19 import re
19 import re
20 from pdb import Restart
20 from pdb import Restart
21
21
22 # cProfile was added in Python2.5
22 import cProfile as profile
23 try:
23 import pstats
24 import cProfile as profile
25 import pstats
26 except ImportError:
27 # profile isn't bundled by default in Debian for license reasons
28 try:
29 import profile, pstats
30 except ImportError:
31 profile = pstats = None
32
24
33 from IPython.core import oinspect
25 from IPython.core import oinspect
34 from IPython.core import magic_arguments
26 from IPython.core import magic_arguments
35 from IPython.core import page
27 from IPython.core import page
36 from IPython.core.error import UsageError
28 from IPython.core.error import UsageError
37 from IPython.core.macro import Macro
29 from IPython.core.macro import Macro
38 from IPython.core.magic import (Magics, magics_class, line_magic, cell_magic,
30 from IPython.core.magic import (Magics, magics_class, line_magic, cell_magic,
39 line_cell_magic, on_off, needs_local_scope,
31 line_cell_magic, on_off, needs_local_scope,
40 no_var_expand)
32 no_var_expand)
41 from IPython.testing.skipdoctest import skip_doctest
33 from IPython.testing.skipdoctest import skip_doctest
42 from IPython.utils.contexts import preserve_keys
34 from IPython.utils.contexts import preserve_keys
43 from IPython.utils.capture import capture_output
35 from IPython.utils.capture import capture_output
44 from IPython.utils.ipstruct import Struct
36 from IPython.utils.ipstruct import Struct
45 from IPython.utils.module_paths import find_mod
37 from IPython.utils.module_paths import find_mod
46 from IPython.utils.path import get_py_filename, shellglob
38 from IPython.utils.path import get_py_filename, shellglob
47 from IPython.utils.timing import clock, clock2
39 from IPython.utils.timing import clock, clock2
48 from warnings import warn
40 from warnings import warn
49 from logging import error
41 from logging import error
50 from io import StringIO
42 from io import StringIO
51
43
52 if sys.version_info > (3,8):
44 if sys.version_info > (3,8):
53 from ast import Module
45 from ast import Module
54 else :
46 else :
55 # mock the new API, ignore second argument
47 # mock the new API, ignore second argument
56 # see https://github.com/ipython/ipython/issues/11590
48 # see https://github.com/ipython/ipython/issues/11590
57 from ast import Module as OriginalModule
49 from ast import Module as OriginalModule
58 Module = lambda nodelist, type_ignores: OriginalModule(nodelist)
50 Module = lambda nodelist, type_ignores: OriginalModule(nodelist)
59
51
60
52
61 #-----------------------------------------------------------------------------
53 #-----------------------------------------------------------------------------
62 # Magic implementation classes
54 # Magic implementation classes
63 #-----------------------------------------------------------------------------
55 #-----------------------------------------------------------------------------
64
56
65
57
66 class TimeitResult(object):
58 class TimeitResult(object):
67 """
59 """
68 Object returned by the timeit magic with info about the run.
60 Object returned by the timeit magic with info about the run.
69
61
70 Contains the following attributes :
62 Contains the following attributes :
71
63
72 loops: (int) number of loops done per measurement
64 loops: (int) number of loops done per measurement
73 repeat: (int) number of times the measurement has been repeated
65 repeat: (int) number of times the measurement has been repeated
74 best: (float) best execution time / number
66 best: (float) best execution time / number
75 all_runs: (list of float) execution time of each run (in s)
67 all_runs: (list of float) execution time of each run (in s)
76 compile_time: (float) time of statement compilation (s)
68 compile_time: (float) time of statement compilation (s)
77
69
78 """
70 """
79 def __init__(self, loops, repeat, best, worst, all_runs, compile_time, precision):
71 def __init__(self, loops, repeat, best, worst, all_runs, compile_time, precision):
80 self.loops = loops
72 self.loops = loops
81 self.repeat = repeat
73 self.repeat = repeat
82 self.best = best
74 self.best = best
83 self.worst = worst
75 self.worst = worst
84 self.all_runs = all_runs
76 self.all_runs = all_runs
85 self.compile_time = compile_time
77 self.compile_time = compile_time
86 self._precision = precision
78 self._precision = precision
87 self.timings = [ dt / self.loops for dt in all_runs]
79 self.timings = [ dt / self.loops for dt in all_runs]
88
80
89 @property
81 @property
90 def average(self):
82 def average(self):
91 return math.fsum(self.timings) / len(self.timings)
83 return math.fsum(self.timings) / len(self.timings)
92
84
93 @property
85 @property
94 def stdev(self):
86 def stdev(self):
95 mean = self.average
87 mean = self.average
96 return (math.fsum([(x - mean) ** 2 for x in self.timings]) / len(self.timings)) ** 0.5
88 return (math.fsum([(x - mean) ** 2 for x in self.timings]) / len(self.timings)) ** 0.5
97
89
98 def __str__(self):
90 def __str__(self):
99 pm = '+-'
91 pm = '+-'
100 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
92 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
101 try:
93 try:
102 u'\xb1'.encode(sys.stdout.encoding)
94 u'\xb1'.encode(sys.stdout.encoding)
103 pm = u'\xb1'
95 pm = u'\xb1'
104 except:
96 except:
105 pass
97 pass
106 return (
98 return (
107 u"{mean} {pm} {std} per loop (mean {pm} std. dev. of {runs} run{run_plural}, {loops} loop{loop_plural} each)"
99 u"{mean} {pm} {std} per loop (mean {pm} std. dev. of {runs} run{run_plural}, {loops} loop{loop_plural} each)"
108 .format(
100 .format(
109 pm = pm,
101 pm = pm,
110 runs = self.repeat,
102 runs = self.repeat,
111 loops = self.loops,
103 loops = self.loops,
112 loop_plural = "" if self.loops == 1 else "s",
104 loop_plural = "" if self.loops == 1 else "s",
113 run_plural = "" if self.repeat == 1 else "s",
105 run_plural = "" if self.repeat == 1 else "s",
114 mean = _format_time(self.average, self._precision),
106 mean = _format_time(self.average, self._precision),
115 std = _format_time(self.stdev, self._precision))
107 std = _format_time(self.stdev, self._precision))
116 )
108 )
117
109
118 def _repr_pretty_(self, p , cycle):
110 def _repr_pretty_(self, p , cycle):
119 unic = self.__str__()
111 unic = self.__str__()
120 p.text(u'<TimeitResult : '+unic+u'>')
112 p.text(u'<TimeitResult : '+unic+u'>')
121
113
122
114
123 class TimeitTemplateFiller(ast.NodeTransformer):
115 class TimeitTemplateFiller(ast.NodeTransformer):
124 """Fill in the AST template for timing execution.
116 """Fill in the AST template for timing execution.
125
117
126 This is quite closely tied to the template definition, which is in
118 This is quite closely tied to the template definition, which is in
127 :meth:`ExecutionMagics.timeit`.
119 :meth:`ExecutionMagics.timeit`.
128 """
120 """
129 def __init__(self, ast_setup, ast_stmt):
121 def __init__(self, ast_setup, ast_stmt):
130 self.ast_setup = ast_setup
122 self.ast_setup = ast_setup
131 self.ast_stmt = ast_stmt
123 self.ast_stmt = ast_stmt
132
124
133 def visit_FunctionDef(self, node):
125 def visit_FunctionDef(self, node):
134 "Fill in the setup statement"
126 "Fill in the setup statement"
135 self.generic_visit(node)
127 self.generic_visit(node)
136 if node.name == "inner":
128 if node.name == "inner":
137 node.body[:1] = self.ast_setup.body
129 node.body[:1] = self.ast_setup.body
138
130
139 return node
131 return node
140
132
141 def visit_For(self, node):
133 def visit_For(self, node):
142 "Fill in the statement to be timed"
134 "Fill in the statement to be timed"
143 if getattr(getattr(node.body[0], 'value', None), 'id', None) == 'stmt':
135 if getattr(getattr(node.body[0], 'value', None), 'id', None) == 'stmt':
144 node.body = self.ast_stmt.body
136 node.body = self.ast_stmt.body
145 return node
137 return node
146
138
147
139
148 class Timer(timeit.Timer):
140 class Timer(timeit.Timer):
149 """Timer class that explicitly uses self.inner
141 """Timer class that explicitly uses self.inner
150
142
151 which is an undocumented implementation detail of CPython,
143 which is an undocumented implementation detail of CPython,
152 not shared by PyPy.
144 not shared by PyPy.
153 """
145 """
154 # Timer.timeit copied from CPython 3.4.2
146 # Timer.timeit copied from CPython 3.4.2
155 def timeit(self, number=timeit.default_number):
147 def timeit(self, number=timeit.default_number):
156 """Time 'number' executions of the main statement.
148 """Time 'number' executions of the main statement.
157
149
158 To be precise, this executes the setup statement once, and
150 To be precise, this executes the setup statement once, and
159 then returns the time it takes to execute the main statement
151 then returns the time it takes to execute the main statement
160 a number of times, as a float measured in seconds. The
152 a number of times, as a float measured in seconds. The
161 argument is the number of times through the loop, defaulting
153 argument is the number of times through the loop, defaulting
162 to one million. The main statement, the setup statement and
154 to one million. The main statement, the setup statement and
163 the timer function to be used are passed to the constructor.
155 the timer function to be used are passed to the constructor.
164 """
156 """
165 it = itertools.repeat(None, number)
157 it = itertools.repeat(None, number)
166 gcold = gc.isenabled()
158 gcold = gc.isenabled()
167 gc.disable()
159 gc.disable()
168 try:
160 try:
169 timing = self.inner(it, self.timer)
161 timing = self.inner(it, self.timer)
170 finally:
162 finally:
171 if gcold:
163 if gcold:
172 gc.enable()
164 gc.enable()
173 return timing
165 return timing
174
166
175
167
176 @magics_class
168 @magics_class
177 class ExecutionMagics(Magics):
169 class ExecutionMagics(Magics):
178 """Magics related to code execution, debugging, profiling, etc.
170 """Magics related to code execution, debugging, profiling, etc.
179
171
180 """
172 """
181
173
182 def __init__(self, shell):
174 def __init__(self, shell):
183 super(ExecutionMagics, self).__init__(shell)
175 super(ExecutionMagics, self).__init__(shell)
184 if profile is None:
176 if profile is None:
185 self.prun = self.profile_missing_notice
177 self.prun = self.profile_missing_notice
186 # Default execution function used to actually run user code.
178 # Default execution function used to actually run user code.
187 self.default_runner = None
179 self.default_runner = None
188
180
189 def profile_missing_notice(self, *args, **kwargs):
181 def profile_missing_notice(self, *args, **kwargs):
190 error("""\
182 error("""\
191 The profile module could not be found. It has been removed from the standard
183 The profile module could not be found. It has been removed from the standard
192 python packages because of its non-free license. To use profiling, install the
184 python packages because of its non-free license. To use profiling, install the
193 python-profiler package from non-free.""")
185 python-profiler package from non-free.""")
194
186
195 @skip_doctest
187 @skip_doctest
196 @no_var_expand
188 @no_var_expand
197 @line_cell_magic
189 @line_cell_magic
198 def prun(self, parameter_s='', cell=None):
190 def prun(self, parameter_s='', cell=None):
199
191
200 """Run a statement through the python code profiler.
192 """Run a statement through the python code profiler.
201
193
202 Usage, in line mode:
194 Usage, in line mode:
203 %prun [options] statement
195 %prun [options] statement
204
196
205 Usage, in cell mode:
197 Usage, in cell mode:
206 %%prun [options] [statement]
198 %%prun [options] [statement]
207 code...
199 code...
208 code...
200 code...
209
201
210 In cell mode, the additional code lines are appended to the (possibly
202 In cell mode, the additional code lines are appended to the (possibly
211 empty) statement in the first line. Cell mode allows you to easily
203 empty) statement in the first line. Cell mode allows you to easily
212 profile multiline blocks without having to put them in a separate
204 profile multiline blocks without having to put them in a separate
213 function.
205 function.
214
206
215 The given statement (which doesn't require quote marks) is run via the
207 The given statement (which doesn't require quote marks) is run via the
216 python profiler in a manner similar to the profile.run() function.
208 python profiler in a manner similar to the profile.run() function.
217 Namespaces are internally managed to work correctly; profile.run
209 Namespaces are internally managed to work correctly; profile.run
218 cannot be used in IPython because it makes certain assumptions about
210 cannot be used in IPython because it makes certain assumptions about
219 namespaces which do not hold under IPython.
211 namespaces which do not hold under IPython.
220
212
221 Options:
213 Options:
222
214
223 -l <limit>
215 -l <limit>
224 you can place restrictions on what or how much of the
216 you can place restrictions on what or how much of the
225 profile gets printed. The limit value can be:
217 profile gets printed. The limit value can be:
226
218
227 * A string: only information for function names containing this string
219 * A string: only information for function names containing this string
228 is printed.
220 is printed.
229
221
230 * An integer: only these many lines are printed.
222 * An integer: only these many lines are printed.
231
223
232 * A float (between 0 and 1): this fraction of the report is printed
224 * A float (between 0 and 1): this fraction of the report is printed
233 (for example, use a limit of 0.4 to see the topmost 40% only).
225 (for example, use a limit of 0.4 to see the topmost 40% only).
234
226
235 You can combine several limits with repeated use of the option. For
227 You can combine several limits with repeated use of the option. For
236 example, ``-l __init__ -l 5`` will print only the topmost 5 lines of
228 example, ``-l __init__ -l 5`` will print only the topmost 5 lines of
237 information about class constructors.
229 information about class constructors.
238
230
239 -r
231 -r
240 return the pstats.Stats object generated by the profiling. This
232 return the pstats.Stats object generated by the profiling. This
241 object has all the information about the profile in it, and you can
233 object has all the information about the profile in it, and you can
242 later use it for further analysis or in other functions.
234 later use it for further analysis or in other functions.
243
235
244 -s <key>
236 -s <key>
245 sort profile by given key. You can provide more than one key
237 sort profile by given key. You can provide more than one key
246 by using the option several times: '-s key1 -s key2 -s key3...'. The
238 by using the option several times: '-s key1 -s key2 -s key3...'. The
247 default sorting key is 'time'.
239 default sorting key is 'time'.
248
240
249 The following is copied verbatim from the profile documentation
241 The following is copied verbatim from the profile documentation
250 referenced below:
242 referenced below:
251
243
252 When more than one key is provided, additional keys are used as
244 When more than one key is provided, additional keys are used as
253 secondary criteria when the there is equality in all keys selected
245 secondary criteria when the there is equality in all keys selected
254 before them.
246 before them.
255
247
256 Abbreviations can be used for any key names, as long as the
248 Abbreviations can be used for any key names, as long as the
257 abbreviation is unambiguous. The following are the keys currently
249 abbreviation is unambiguous. The following are the keys currently
258 defined:
250 defined:
259
251
260 ============ =====================
252 ============ =====================
261 Valid Arg Meaning
253 Valid Arg Meaning
262 ============ =====================
254 ============ =====================
263 "calls" call count
255 "calls" call count
264 "cumulative" cumulative time
256 "cumulative" cumulative time
265 "file" file name
257 "file" file name
266 "module" file name
258 "module" file name
267 "pcalls" primitive call count
259 "pcalls" primitive call count
268 "line" line number
260 "line" line number
269 "name" function name
261 "name" function name
270 "nfl" name/file/line
262 "nfl" name/file/line
271 "stdname" standard name
263 "stdname" standard name
272 "time" internal time
264 "time" internal time
273 ============ =====================
265 ============ =====================
274
266
275 Note that all sorts on statistics are in descending order (placing
267 Note that all sorts on statistics are in descending order (placing
276 most time consuming items first), where as name, file, and line number
268 most time consuming items first), where as name, file, and line number
277 searches are in ascending order (i.e., alphabetical). The subtle
269 searches are in ascending order (i.e., alphabetical). The subtle
278 distinction between "nfl" and "stdname" is that the standard name is a
270 distinction between "nfl" and "stdname" is that the standard name is a
279 sort of the name as printed, which means that the embedded line
271 sort of the name as printed, which means that the embedded line
280 numbers get compared in an odd way. For example, lines 3, 20, and 40
272 numbers get compared in an odd way. For example, lines 3, 20, and 40
281 would (if the file names were the same) appear in the string order
273 would (if the file names were the same) appear in the string order
282 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
274 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
283 line numbers. In fact, sort_stats("nfl") is the same as
275 line numbers. In fact, sort_stats("nfl") is the same as
284 sort_stats("name", "file", "line").
276 sort_stats("name", "file", "line").
285
277
286 -T <filename>
278 -T <filename>
287 save profile results as shown on screen to a text
279 save profile results as shown on screen to a text
288 file. The profile is still shown on screen.
280 file. The profile is still shown on screen.
289
281
290 -D <filename>
282 -D <filename>
291 save (via dump_stats) profile statistics to given
283 save (via dump_stats) profile statistics to given
292 filename. This data is in a format understood by the pstats module, and
284 filename. This data is in a format understood by the pstats module, and
293 is generated by a call to the dump_stats() method of profile
285 is generated by a call to the dump_stats() method of profile
294 objects. The profile is still shown on screen.
286 objects. The profile is still shown on screen.
295
287
296 -q
288 -q
297 suppress output to the pager. Best used with -T and/or -D above.
289 suppress output to the pager. Best used with -T and/or -D above.
298
290
299 If you want to run complete programs under the profiler's control, use
291 If you want to run complete programs under the profiler's control, use
300 ``%run -p [prof_opts] filename.py [args to program]`` where prof_opts
292 ``%run -p [prof_opts] filename.py [args to program]`` where prof_opts
301 contains profiler specific options as described here.
293 contains profiler specific options as described here.
302
294
303 You can read the complete documentation for the profile module with::
295 You can read the complete documentation for the profile module with::
304
296
305 In [1]: import profile; profile.help()
297 In [1]: import profile; profile.help()
306
298
307 .. versionchanged:: 7.3
299 .. versionchanged:: 7.3
308 User variables are no longer expanded,
300 User variables are no longer expanded,
309 the magic line is always left unmodified.
301 the magic line is always left unmodified.
310
302
311 """
303 """
312 opts, arg_str = self.parse_options(parameter_s, 'D:l:rs:T:q',
304 opts, arg_str = self.parse_options(parameter_s, 'D:l:rs:T:q',
313 list_all=True, posix=False)
305 list_all=True, posix=False)
314 if cell is not None:
306 if cell is not None:
315 arg_str += '\n' + cell
307 arg_str += '\n' + cell
316 arg_str = self.shell.transform_cell(arg_str)
308 arg_str = self.shell.transform_cell(arg_str)
317 return self._run_with_profiler(arg_str, opts, self.shell.user_ns)
309 return self._run_with_profiler(arg_str, opts, self.shell.user_ns)
318
310
319 def _run_with_profiler(self, code, opts, namespace):
311 def _run_with_profiler(self, code, opts, namespace):
320 """
312 """
321 Run `code` with profiler. Used by ``%prun`` and ``%run -p``.
313 Run `code` with profiler. Used by ``%prun`` and ``%run -p``.
322
314
323 Parameters
315 Parameters
324 ----------
316 ----------
325 code : str
317 code : str
326 Code to be executed.
318 Code to be executed.
327 opts : Struct
319 opts : Struct
328 Options parsed by `self.parse_options`.
320 Options parsed by `self.parse_options`.
329 namespace : dict
321 namespace : dict
330 A dictionary for Python namespace (e.g., `self.shell.user_ns`).
322 A dictionary for Python namespace (e.g., `self.shell.user_ns`).
331
323
332 """
324 """
333
325
334 # Fill default values for unspecified options:
326 # Fill default values for unspecified options:
335 opts.merge(Struct(D=[''], l=[], s=['time'], T=['']))
327 opts.merge(Struct(D=[''], l=[], s=['time'], T=['']))
336
328
337 prof = profile.Profile()
329 prof = profile.Profile()
338 try:
330 try:
339 prof = prof.runctx(code, namespace, namespace)
331 prof = prof.runctx(code, namespace, namespace)
340 sys_exit = ''
332 sys_exit = ''
341 except SystemExit:
333 except SystemExit:
342 sys_exit = """*** SystemExit exception caught in code being profiled."""
334 sys_exit = """*** SystemExit exception caught in code being profiled."""
343
335
344 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
336 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
345
337
346 lims = opts.l
338 lims = opts.l
347 if lims:
339 if lims:
348 lims = [] # rebuild lims with ints/floats/strings
340 lims = [] # rebuild lims with ints/floats/strings
349 for lim in opts.l:
341 for lim in opts.l:
350 try:
342 try:
351 lims.append(int(lim))
343 lims.append(int(lim))
352 except ValueError:
344 except ValueError:
353 try:
345 try:
354 lims.append(float(lim))
346 lims.append(float(lim))
355 except ValueError:
347 except ValueError:
356 lims.append(lim)
348 lims.append(lim)
357
349
358 # Trap output.
350 # Trap output.
359 stdout_trap = StringIO()
351 stdout_trap = StringIO()
360 stats_stream = stats.stream
352 stats_stream = stats.stream
361 try:
353 try:
362 stats.stream = stdout_trap
354 stats.stream = stdout_trap
363 stats.print_stats(*lims)
355 stats.print_stats(*lims)
364 finally:
356 finally:
365 stats.stream = stats_stream
357 stats.stream = stats_stream
366
358
367 output = stdout_trap.getvalue()
359 output = stdout_trap.getvalue()
368 output = output.rstrip()
360 output = output.rstrip()
369
361
370 if 'q' not in opts:
362 if 'q' not in opts:
371 page.page(output)
363 page.page(output)
372 print(sys_exit, end=' ')
364 print(sys_exit, end=' ')
373
365
374 dump_file = opts.D[0]
366 dump_file = opts.D[0]
375 text_file = opts.T[0]
367 text_file = opts.T[0]
376 if dump_file:
368 if dump_file:
377 prof.dump_stats(dump_file)
369 prof.dump_stats(dump_file)
378 print('\n*** Profile stats marshalled to file',\
370 print('\n*** Profile stats marshalled to file',\
379 repr(dump_file)+'.',sys_exit)
371 repr(dump_file)+'.',sys_exit)
380 if text_file:
372 if text_file:
381 with open(text_file, 'w') as pfile:
373 with open(text_file, 'w') as pfile:
382 pfile.write(output)
374 pfile.write(output)
383 print('\n*** Profile printout saved to text file',\
375 print('\n*** Profile printout saved to text file',\
384 repr(text_file)+'.',sys_exit)
376 repr(text_file)+'.',sys_exit)
385
377
386 if 'r' in opts:
378 if 'r' in opts:
387 return stats
379 return stats
388 else:
380 else:
389 return None
381 return None
390
382
391 @line_magic
383 @line_magic
392 def pdb(self, parameter_s=''):
384 def pdb(self, parameter_s=''):
393 """Control the automatic calling of the pdb interactive debugger.
385 """Control the automatic calling of the pdb interactive debugger.
394
386
395 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
387 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
396 argument it works as a toggle.
388 argument it works as a toggle.
397
389
398 When an exception is triggered, IPython can optionally call the
390 When an exception is triggered, IPython can optionally call the
399 interactive pdb debugger after the traceback printout. %pdb toggles
391 interactive pdb debugger after the traceback printout. %pdb toggles
400 this feature on and off.
392 this feature on and off.
401
393
402 The initial state of this feature is set in your configuration
394 The initial state of this feature is set in your configuration
403 file (the option is ``InteractiveShell.pdb``).
395 file (the option is ``InteractiveShell.pdb``).
404
396
405 If you want to just activate the debugger AFTER an exception has fired,
397 If you want to just activate the debugger AFTER an exception has fired,
406 without having to type '%pdb on' and rerunning your code, you can use
398 without having to type '%pdb on' and rerunning your code, you can use
407 the %debug magic."""
399 the %debug magic."""
408
400
409 par = parameter_s.strip().lower()
401 par = parameter_s.strip().lower()
410
402
411 if par:
403 if par:
412 try:
404 try:
413 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
405 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
414 except KeyError:
406 except KeyError:
415 print ('Incorrect argument. Use on/1, off/0, '
407 print ('Incorrect argument. Use on/1, off/0, '
416 'or nothing for a toggle.')
408 'or nothing for a toggle.')
417 return
409 return
418 else:
410 else:
419 # toggle
411 # toggle
420 new_pdb = not self.shell.call_pdb
412 new_pdb = not self.shell.call_pdb
421
413
422 # set on the shell
414 # set on the shell
423 self.shell.call_pdb = new_pdb
415 self.shell.call_pdb = new_pdb
424 print('Automatic pdb calling has been turned',on_off(new_pdb))
416 print('Automatic pdb calling has been turned',on_off(new_pdb))
425
417
426 @skip_doctest
418 @skip_doctest
427 @magic_arguments.magic_arguments()
419 @magic_arguments.magic_arguments()
428 @magic_arguments.argument('--breakpoint', '-b', metavar='FILE:LINE',
420 @magic_arguments.argument('--breakpoint', '-b', metavar='FILE:LINE',
429 help="""
421 help="""
430 Set break point at LINE in FILE.
422 Set break point at LINE in FILE.
431 """
423 """
432 )
424 )
433 @magic_arguments.argument('statement', nargs='*',
425 @magic_arguments.argument('statement', nargs='*',
434 help="""
426 help="""
435 Code to run in debugger.
427 Code to run in debugger.
436 You can omit this in cell magic mode.
428 You can omit this in cell magic mode.
437 """
429 """
438 )
430 )
439 @no_var_expand
431 @no_var_expand
440 @line_cell_magic
432 @line_cell_magic
441 def debug(self, line='', cell=None):
433 def debug(self, line='', cell=None):
442 """Activate the interactive debugger.
434 """Activate the interactive debugger.
443
435
444 This magic command support two ways of activating debugger.
436 This magic command support two ways of activating debugger.
445 One is to activate debugger before executing code. This way, you
437 One is to activate debugger before executing code. This way, you
446 can set a break point, to step through the code from the point.
438 can set a break point, to step through the code from the point.
447 You can use this mode by giving statements to execute and optionally
439 You can use this mode by giving statements to execute and optionally
448 a breakpoint.
440 a breakpoint.
449
441
450 The other one is to activate debugger in post-mortem mode. You can
442 The other one is to activate debugger in post-mortem mode. You can
451 activate this mode simply running %debug without any argument.
443 activate this mode simply running %debug without any argument.
452 If an exception has just occurred, this lets you inspect its stack
444 If an exception has just occurred, this lets you inspect its stack
453 frames interactively. Note that this will always work only on the last
445 frames interactively. Note that this will always work only on the last
454 traceback that occurred, so you must call this quickly after an
446 traceback that occurred, so you must call this quickly after an
455 exception that you wish to inspect has fired, because if another one
447 exception that you wish to inspect has fired, because if another one
456 occurs, it clobbers the previous one.
448 occurs, it clobbers the previous one.
457
449
458 If you want IPython to automatically do this on every exception, see
450 If you want IPython to automatically do this on every exception, see
459 the %pdb magic for more details.
451 the %pdb magic for more details.
460
452
461 .. versionchanged:: 7.3
453 .. versionchanged:: 7.3
462 When running code, user variables are no longer expanded,
454 When running code, user variables are no longer expanded,
463 the magic line is always left unmodified.
455 the magic line is always left unmodified.
464
456
465 """
457 """
466 args = magic_arguments.parse_argstring(self.debug, line)
458 args = magic_arguments.parse_argstring(self.debug, line)
467
459
468 if not (args.breakpoint or args.statement or cell):
460 if not (args.breakpoint or args.statement or cell):
469 self._debug_post_mortem()
461 self._debug_post_mortem()
470 else:
462 else:
471 code = "\n".join(args.statement)
463 code = "\n".join(args.statement)
472 if cell:
464 if cell:
473 code += "\n" + cell
465 code += "\n" + cell
474 self._debug_exec(code, args.breakpoint)
466 self._debug_exec(code, args.breakpoint)
475
467
476 def _debug_post_mortem(self):
468 def _debug_post_mortem(self):
477 self.shell.debugger(force=True)
469 self.shell.debugger(force=True)
478
470
479 def _debug_exec(self, code, breakpoint):
471 def _debug_exec(self, code, breakpoint):
480 if breakpoint:
472 if breakpoint:
481 (filename, bp_line) = breakpoint.rsplit(':', 1)
473 (filename, bp_line) = breakpoint.rsplit(':', 1)
482 bp_line = int(bp_line)
474 bp_line = int(bp_line)
483 else:
475 else:
484 (filename, bp_line) = (None, None)
476 (filename, bp_line) = (None, None)
485 self._run_with_debugger(code, self.shell.user_ns, filename, bp_line)
477 self._run_with_debugger(code, self.shell.user_ns, filename, bp_line)
486
478
487 @line_magic
479 @line_magic
488 def tb(self, s):
480 def tb(self, s):
489 """Print the last traceback.
481 """Print the last traceback.
490
482
491 Optionally, specify an exception reporting mode, tuning the
483 Optionally, specify an exception reporting mode, tuning the
492 verbosity of the traceback. By default the currently-active exception
484 verbosity of the traceback. By default the currently-active exception
493 mode is used. See %xmode for changing exception reporting modes.
485 mode is used. See %xmode for changing exception reporting modes.
494
486
495 Valid modes: Plain, Context, Verbose, and Minimal.
487 Valid modes: Plain, Context, Verbose, and Minimal.
496 """
488 """
497 interactive_tb = self.shell.InteractiveTB
489 interactive_tb = self.shell.InteractiveTB
498 if s:
490 if s:
499 # Switch exception reporting mode for this one call.
491 # Switch exception reporting mode for this one call.
500 # Ensure it is switched back.
492 # Ensure it is switched back.
501 def xmode_switch_err(name):
493 def xmode_switch_err(name):
502 warn('Error changing %s exception modes.\n%s' %
494 warn('Error changing %s exception modes.\n%s' %
503 (name,sys.exc_info()[1]))
495 (name,sys.exc_info()[1]))
504
496
505 new_mode = s.strip().capitalize()
497 new_mode = s.strip().capitalize()
506 original_mode = interactive_tb.mode
498 original_mode = interactive_tb.mode
507 try:
499 try:
508 try:
500 try:
509 interactive_tb.set_mode(mode=new_mode)
501 interactive_tb.set_mode(mode=new_mode)
510 except Exception:
502 except Exception:
511 xmode_switch_err('user')
503 xmode_switch_err('user')
512 else:
504 else:
513 self.shell.showtraceback()
505 self.shell.showtraceback()
514 finally:
506 finally:
515 interactive_tb.set_mode(mode=original_mode)
507 interactive_tb.set_mode(mode=original_mode)
516 else:
508 else:
517 self.shell.showtraceback()
509 self.shell.showtraceback()
518
510
519 @skip_doctest
511 @skip_doctest
520 @line_magic
512 @line_magic
521 def run(self, parameter_s='', runner=None,
513 def run(self, parameter_s='', runner=None,
522 file_finder=get_py_filename):
514 file_finder=get_py_filename):
523 """Run the named file inside IPython as a program.
515 """Run the named file inside IPython as a program.
524
516
525 Usage::
517 Usage::
526
518
527 %run [-n -i -e -G]
519 %run [-n -i -e -G]
528 [( -t [-N<N>] | -d [-b<N>] | -p [profile options] )]
520 [( -t [-N<N>] | -d [-b<N>] | -p [profile options] )]
529 ( -m mod | file ) [args]
521 ( -m mod | file ) [args]
530
522
531 Parameters after the filename are passed as command-line arguments to
523 Parameters after the filename are passed as command-line arguments to
532 the program (put in sys.argv). Then, control returns to IPython's
524 the program (put in sys.argv). Then, control returns to IPython's
533 prompt.
525 prompt.
534
526
535 This is similar to running at a system prompt ``python file args``,
527 This is similar to running at a system prompt ``python file args``,
536 but with the advantage of giving you IPython's tracebacks, and of
528 but with the advantage of giving you IPython's tracebacks, and of
537 loading all variables into your interactive namespace for further use
529 loading all variables into your interactive namespace for further use
538 (unless -p is used, see below).
530 (unless -p is used, see below).
539
531
540 The file is executed in a namespace initially consisting only of
532 The file is executed in a namespace initially consisting only of
541 ``__name__=='__main__'`` and sys.argv constructed as indicated. It thus
533 ``__name__=='__main__'`` and sys.argv constructed as indicated. It thus
542 sees its environment as if it were being run as a stand-alone program
534 sees its environment as if it were being run as a stand-alone program
543 (except for sharing global objects such as previously imported
535 (except for sharing global objects such as previously imported
544 modules). But after execution, the IPython interactive namespace gets
536 modules). But after execution, the IPython interactive namespace gets
545 updated with all variables defined in the program (except for __name__
537 updated with all variables defined in the program (except for __name__
546 and sys.argv). This allows for very convenient loading of code for
538 and sys.argv). This allows for very convenient loading of code for
547 interactive work, while giving each program a 'clean sheet' to run in.
539 interactive work, while giving each program a 'clean sheet' to run in.
548
540
549 Arguments are expanded using shell-like glob match. Patterns
541 Arguments are expanded using shell-like glob match. Patterns
550 '*', '?', '[seq]' and '[!seq]' can be used. Additionally,
542 '*', '?', '[seq]' and '[!seq]' can be used. Additionally,
551 tilde '~' will be expanded into user's home directory. Unlike
543 tilde '~' will be expanded into user's home directory. Unlike
552 real shells, quotation does not suppress expansions. Use
544 real shells, quotation does not suppress expansions. Use
553 *two* back slashes (e.g. ``\\\\*``) to suppress expansions.
545 *two* back slashes (e.g. ``\\\\*``) to suppress expansions.
554 To completely disable these expansions, you can use -G flag.
546 To completely disable these expansions, you can use -G flag.
555
547
556 On Windows systems, the use of single quotes `'` when specifying
548 On Windows systems, the use of single quotes `'` when specifying
557 a file is not supported. Use double quotes `"`.
549 a file is not supported. Use double quotes `"`.
558
550
559 Options:
551 Options:
560
552
561 -n
553 -n
562 __name__ is NOT set to '__main__', but to the running file's name
554 __name__ is NOT set to '__main__', but to the running file's name
563 without extension (as python does under import). This allows running
555 without extension (as python does under import). This allows running
564 scripts and reloading the definitions in them without calling code
556 scripts and reloading the definitions in them without calling code
565 protected by an ``if __name__ == "__main__"`` clause.
557 protected by an ``if __name__ == "__main__"`` clause.
566
558
567 -i
559 -i
568 run the file in IPython's namespace instead of an empty one. This
560 run the file in IPython's namespace instead of an empty one. This
569 is useful if you are experimenting with code written in a text editor
561 is useful if you are experimenting with code written in a text editor
570 which depends on variables defined interactively.
562 which depends on variables defined interactively.
571
563
572 -e
564 -e
573 ignore sys.exit() calls or SystemExit exceptions in the script
565 ignore sys.exit() calls or SystemExit exceptions in the script
574 being run. This is particularly useful if IPython is being used to
566 being run. This is particularly useful if IPython is being used to
575 run unittests, which always exit with a sys.exit() call. In such
567 run unittests, which always exit with a sys.exit() call. In such
576 cases you are interested in the output of the test results, not in
568 cases you are interested in the output of the test results, not in
577 seeing a traceback of the unittest module.
569 seeing a traceback of the unittest module.
578
570
579 -t
571 -t
580 print timing information at the end of the run. IPython will give
572 print timing information at the end of the run. IPython will give
581 you an estimated CPU time consumption for your script, which under
573 you an estimated CPU time consumption for your script, which under
582 Unix uses the resource module to avoid the wraparound problems of
574 Unix uses the resource module to avoid the wraparound problems of
583 time.clock(). Under Unix, an estimate of time spent on system tasks
575 time.clock(). Under Unix, an estimate of time spent on system tasks
584 is also given (for Windows platforms this is reported as 0.0).
576 is also given (for Windows platforms this is reported as 0.0).
585
577
586 If -t is given, an additional ``-N<N>`` option can be given, where <N>
578 If -t is given, an additional ``-N<N>`` option can be given, where <N>
587 must be an integer indicating how many times you want the script to
579 must be an integer indicating how many times you want the script to
588 run. The final timing report will include total and per run results.
580 run. The final timing report will include total and per run results.
589
581
590 For example (testing the script uniq_stable.py)::
582 For example (testing the script uniq_stable.py)::
591
583
592 In [1]: run -t uniq_stable
584 In [1]: run -t uniq_stable
593
585
594 IPython CPU timings (estimated):
586 IPython CPU timings (estimated):
595 User : 0.19597 s.
587 User : 0.19597 s.
596 System: 0.0 s.
588 System: 0.0 s.
597
589
598 In [2]: run -t -N5 uniq_stable
590 In [2]: run -t -N5 uniq_stable
599
591
600 IPython CPU timings (estimated):
592 IPython CPU timings (estimated):
601 Total runs performed: 5
593 Total runs performed: 5
602 Times : Total Per run
594 Times : Total Per run
603 User : 0.910862 s, 0.1821724 s.
595 User : 0.910862 s, 0.1821724 s.
604 System: 0.0 s, 0.0 s.
596 System: 0.0 s, 0.0 s.
605
597
606 -d
598 -d
607 run your program under the control of pdb, the Python debugger.
599 run your program under the control of pdb, the Python debugger.
608 This allows you to execute your program step by step, watch variables,
600 This allows you to execute your program step by step, watch variables,
609 etc. Internally, what IPython does is similar to calling::
601 etc. Internally, what IPython does is similar to calling::
610
602
611 pdb.run('execfile("YOURFILENAME")')
603 pdb.run('execfile("YOURFILENAME")')
612
604
613 with a breakpoint set on line 1 of your file. You can change the line
605 with a breakpoint set on line 1 of your file. You can change the line
614 number for this automatic breakpoint to be <N> by using the -bN option
606 number for this automatic breakpoint to be <N> by using the -bN option
615 (where N must be an integer). For example::
607 (where N must be an integer). For example::
616
608
617 %run -d -b40 myscript
609 %run -d -b40 myscript
618
610
619 will set the first breakpoint at line 40 in myscript.py. Note that
611 will set the first breakpoint at line 40 in myscript.py. Note that
620 the first breakpoint must be set on a line which actually does
612 the first breakpoint must be set on a line which actually does
621 something (not a comment or docstring) for it to stop execution.
613 something (not a comment or docstring) for it to stop execution.
622
614
623 Or you can specify a breakpoint in a different file::
615 Or you can specify a breakpoint in a different file::
624
616
625 %run -d -b myotherfile.py:20 myscript
617 %run -d -b myotherfile.py:20 myscript
626
618
627 When the pdb debugger starts, you will see a (Pdb) prompt. You must
619 When the pdb debugger starts, you will see a (Pdb) prompt. You must
628 first enter 'c' (without quotes) to start execution up to the first
620 first enter 'c' (without quotes) to start execution up to the first
629 breakpoint.
621 breakpoint.
630
622
631 Entering 'help' gives information about the use of the debugger. You
623 Entering 'help' gives information about the use of the debugger. You
632 can easily see pdb's full documentation with "import pdb;pdb.help()"
624 can easily see pdb's full documentation with "import pdb;pdb.help()"
633 at a prompt.
625 at a prompt.
634
626
635 -p
627 -p
636 run program under the control of the Python profiler module (which
628 run program under the control of the Python profiler module (which
637 prints a detailed report of execution times, function calls, etc).
629 prints a detailed report of execution times, function calls, etc).
638
630
639 You can pass other options after -p which affect the behavior of the
631 You can pass other options after -p which affect the behavior of the
640 profiler itself. See the docs for %prun for details.
632 profiler itself. See the docs for %prun for details.
641
633
642 In this mode, the program's variables do NOT propagate back to the
634 In this mode, the program's variables do NOT propagate back to the
643 IPython interactive namespace (because they remain in the namespace
635 IPython interactive namespace (because they remain in the namespace
644 where the profiler executes them).
636 where the profiler executes them).
645
637
646 Internally this triggers a call to %prun, see its documentation for
638 Internally this triggers a call to %prun, see its documentation for
647 details on the options available specifically for profiling.
639 details on the options available specifically for profiling.
648
640
649 There is one special usage for which the text above doesn't apply:
641 There is one special usage for which the text above doesn't apply:
650 if the filename ends with .ipy[nb], the file is run as ipython script,
642 if the filename ends with .ipy[nb], the file is run as ipython script,
651 just as if the commands were written on IPython prompt.
643 just as if the commands were written on IPython prompt.
652
644
653 -m
645 -m
654 specify module name to load instead of script path. Similar to
646 specify module name to load instead of script path. Similar to
655 the -m option for the python interpreter. Use this option last if you
647 the -m option for the python interpreter. Use this option last if you
656 want to combine with other %run options. Unlike the python interpreter
648 want to combine with other %run options. Unlike the python interpreter
657 only source modules are allowed no .pyc or .pyo files.
649 only source modules are allowed no .pyc or .pyo files.
658 For example::
650 For example::
659
651
660 %run -m example
652 %run -m example
661
653
662 will run the example module.
654 will run the example module.
663
655
664 -G
656 -G
665 disable shell-like glob expansion of arguments.
657 disable shell-like glob expansion of arguments.
666
658
667 """
659 """
668
660
669 # Logic to handle issue #3664
661 # Logic to handle issue #3664
670 # Add '--' after '-m <module_name>' to ignore additional args passed to a module.
662 # Add '--' after '-m <module_name>' to ignore additional args passed to a module.
671 if '-m' in parameter_s and '--' not in parameter_s:
663 if '-m' in parameter_s and '--' not in parameter_s:
672 argv = shlex.split(parameter_s, posix=(os.name == 'posix'))
664 argv = shlex.split(parameter_s, posix=(os.name == 'posix'))
673 for idx, arg in enumerate(argv):
665 for idx, arg in enumerate(argv):
674 if arg and arg.startswith('-') and arg != '-':
666 if arg and arg.startswith('-') and arg != '-':
675 if arg == '-m':
667 if arg == '-m':
676 argv.insert(idx + 2, '--')
668 argv.insert(idx + 2, '--')
677 break
669 break
678 else:
670 else:
679 # Positional arg, break
671 # Positional arg, break
680 break
672 break
681 parameter_s = ' '.join(shlex.quote(arg) for arg in argv)
673 parameter_s = ' '.join(shlex.quote(arg) for arg in argv)
682
674
683 # get arguments and set sys.argv for program to be run.
675 # get arguments and set sys.argv for program to be run.
684 opts, arg_lst = self.parse_options(parameter_s,
676 opts, arg_lst = self.parse_options(parameter_s,
685 'nidtN:b:pD:l:rs:T:em:G',
677 'nidtN:b:pD:l:rs:T:em:G',
686 mode='list', list_all=1)
678 mode='list', list_all=1)
687 if "m" in opts:
679 if "m" in opts:
688 modulename = opts["m"][0]
680 modulename = opts["m"][0]
689 modpath = find_mod(modulename)
681 modpath = find_mod(modulename)
690 if modpath is None:
682 if modpath is None:
691 warn('%r is not a valid modulename on sys.path'%modulename)
683 warn('%r is not a valid modulename on sys.path'%modulename)
692 return
684 return
693 arg_lst = [modpath] + arg_lst
685 arg_lst = [modpath] + arg_lst
694 try:
686 try:
695 fpath = None # initialize to make sure fpath is in scope later
687 fpath = None # initialize to make sure fpath is in scope later
696 fpath = arg_lst[0]
688 fpath = arg_lst[0]
697 filename = file_finder(fpath)
689 filename = file_finder(fpath)
698 except IndexError:
690 except IndexError:
699 warn('you must provide at least a filename.')
691 warn('you must provide at least a filename.')
700 print('\n%run:\n', oinspect.getdoc(self.run))
692 print('\n%run:\n', oinspect.getdoc(self.run))
701 return
693 return
702 except IOError as e:
694 except IOError as e:
703 try:
695 try:
704 msg = str(e)
696 msg = str(e)
705 except UnicodeError:
697 except UnicodeError:
706 msg = e.message
698 msg = e.message
707 if os.name == 'nt' and re.match(r"^'.*'$",fpath):
699 if os.name == 'nt' and re.match(r"^'.*'$",fpath):
708 warn('For Windows, use double quotes to wrap a filename: %run "mypath\\myfile.py"')
700 warn('For Windows, use double quotes to wrap a filename: %run "mypath\\myfile.py"')
709 error(msg)
701 error(msg)
710 return
702 return
711
703
712 if filename.lower().endswith(('.ipy', '.ipynb')):
704 if filename.lower().endswith(('.ipy', '.ipynb')):
713 with preserve_keys(self.shell.user_ns, '__file__'):
705 with preserve_keys(self.shell.user_ns, '__file__'):
714 self.shell.user_ns['__file__'] = filename
706 self.shell.user_ns['__file__'] = filename
715 self.shell.safe_execfile_ipy(filename)
707 self.shell.safe_execfile_ipy(filename)
716 return
708 return
717
709
718 # Control the response to exit() calls made by the script being run
710 # Control the response to exit() calls made by the script being run
719 exit_ignore = 'e' in opts
711 exit_ignore = 'e' in opts
720
712
721 # Make sure that the running script gets a proper sys.argv as if it
713 # Make sure that the running script gets a proper sys.argv as if it
722 # were run from a system shell.
714 # were run from a system shell.
723 save_argv = sys.argv # save it for later restoring
715 save_argv = sys.argv # save it for later restoring
724
716
725 if 'G' in opts:
717 if 'G' in opts:
726 args = arg_lst[1:]
718 args = arg_lst[1:]
727 else:
719 else:
728 # tilde and glob expansion
720 # tilde and glob expansion
729 args = shellglob(map(os.path.expanduser, arg_lst[1:]))
721 args = shellglob(map(os.path.expanduser, arg_lst[1:]))
730
722
731 sys.argv = [filename] + args # put in the proper filename
723 sys.argv = [filename] + args # put in the proper filename
732
724
733 if 'n' in opts:
725 if 'n' in opts:
734 name = os.path.splitext(os.path.basename(filename))[0]
726 name = os.path.splitext(os.path.basename(filename))[0]
735 else:
727 else:
736 name = '__main__'
728 name = '__main__'
737
729
738 if 'i' in opts:
730 if 'i' in opts:
739 # Run in user's interactive namespace
731 # Run in user's interactive namespace
740 prog_ns = self.shell.user_ns
732 prog_ns = self.shell.user_ns
741 __name__save = self.shell.user_ns['__name__']
733 __name__save = self.shell.user_ns['__name__']
742 prog_ns['__name__'] = name
734 prog_ns['__name__'] = name
743 main_mod = self.shell.user_module
735 main_mod = self.shell.user_module
744
736
745 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
737 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
746 # set the __file__ global in the script's namespace
738 # set the __file__ global in the script's namespace
747 # TK: Is this necessary in interactive mode?
739 # TK: Is this necessary in interactive mode?
748 prog_ns['__file__'] = filename
740 prog_ns['__file__'] = filename
749 else:
741 else:
750 # Run in a fresh, empty namespace
742 # Run in a fresh, empty namespace
751
743
752 # The shell MUST hold a reference to prog_ns so after %run
744 # The shell MUST hold a reference to prog_ns so after %run
753 # exits, the python deletion mechanism doesn't zero it out
745 # exits, the python deletion mechanism doesn't zero it out
754 # (leaving dangling references). See interactiveshell for details
746 # (leaving dangling references). See interactiveshell for details
755 main_mod = self.shell.new_main_mod(filename, name)
747 main_mod = self.shell.new_main_mod(filename, name)
756 prog_ns = main_mod.__dict__
748 prog_ns = main_mod.__dict__
757
749
758 # pickle fix. See interactiveshell for an explanation. But we need to
750 # pickle fix. See interactiveshell for an explanation. But we need to
759 # make sure that, if we overwrite __main__, we replace it at the end
751 # make sure that, if we overwrite __main__, we replace it at the end
760 main_mod_name = prog_ns['__name__']
752 main_mod_name = prog_ns['__name__']
761
753
762 if main_mod_name == '__main__':
754 if main_mod_name == '__main__':
763 restore_main = sys.modules['__main__']
755 restore_main = sys.modules['__main__']
764 else:
756 else:
765 restore_main = False
757 restore_main = False
766
758
767 # This needs to be undone at the end to prevent holding references to
759 # This needs to be undone at the end to prevent holding references to
768 # every single object ever created.
760 # every single object ever created.
769 sys.modules[main_mod_name] = main_mod
761 sys.modules[main_mod_name] = main_mod
770
762
771 if 'p' in opts or 'd' in opts:
763 if 'p' in opts or 'd' in opts:
772 if 'm' in opts:
764 if 'm' in opts:
773 code = 'run_module(modulename, prog_ns)'
765 code = 'run_module(modulename, prog_ns)'
774 code_ns = {
766 code_ns = {
775 'run_module': self.shell.safe_run_module,
767 'run_module': self.shell.safe_run_module,
776 'prog_ns': prog_ns,
768 'prog_ns': prog_ns,
777 'modulename': modulename,
769 'modulename': modulename,
778 }
770 }
779 else:
771 else:
780 if 'd' in opts:
772 if 'd' in opts:
781 # allow exceptions to raise in debug mode
773 # allow exceptions to raise in debug mode
782 code = 'execfile(filename, prog_ns, raise_exceptions=True)'
774 code = 'execfile(filename, prog_ns, raise_exceptions=True)'
783 else:
775 else:
784 code = 'execfile(filename, prog_ns)'
776 code = 'execfile(filename, prog_ns)'
785 code_ns = {
777 code_ns = {
786 'execfile': self.shell.safe_execfile,
778 'execfile': self.shell.safe_execfile,
787 'prog_ns': prog_ns,
779 'prog_ns': prog_ns,
788 'filename': get_py_filename(filename),
780 'filename': get_py_filename(filename),
789 }
781 }
790
782
791 try:
783 try:
792 stats = None
784 stats = None
793 if 'p' in opts:
785 if 'p' in opts:
794 stats = self._run_with_profiler(code, opts, code_ns)
786 stats = self._run_with_profiler(code, opts, code_ns)
795 else:
787 else:
796 if 'd' in opts:
788 if 'd' in opts:
797 bp_file, bp_line = parse_breakpoint(
789 bp_file, bp_line = parse_breakpoint(
798 opts.get('b', ['1'])[0], filename)
790 opts.get('b', ['1'])[0], filename)
799 self._run_with_debugger(
791 self._run_with_debugger(
800 code, code_ns, filename, bp_line, bp_file)
792 code, code_ns, filename, bp_line, bp_file)
801 else:
793 else:
802 if 'm' in opts:
794 if 'm' in opts:
803 def run():
795 def run():
804 self.shell.safe_run_module(modulename, prog_ns)
796 self.shell.safe_run_module(modulename, prog_ns)
805 else:
797 else:
806 if runner is None:
798 if runner is None:
807 runner = self.default_runner
799 runner = self.default_runner
808 if runner is None:
800 if runner is None:
809 runner = self.shell.safe_execfile
801 runner = self.shell.safe_execfile
810
802
811 def run():
803 def run():
812 runner(filename, prog_ns, prog_ns,
804 runner(filename, prog_ns, prog_ns,
813 exit_ignore=exit_ignore)
805 exit_ignore=exit_ignore)
814
806
815 if 't' in opts:
807 if 't' in opts:
816 # timed execution
808 # timed execution
817 try:
809 try:
818 nruns = int(opts['N'][0])
810 nruns = int(opts['N'][0])
819 if nruns < 1:
811 if nruns < 1:
820 error('Number of runs must be >=1')
812 error('Number of runs must be >=1')
821 return
813 return
822 except (KeyError):
814 except (KeyError):
823 nruns = 1
815 nruns = 1
824 self._run_with_timing(run, nruns)
816 self._run_with_timing(run, nruns)
825 else:
817 else:
826 # regular execution
818 # regular execution
827 run()
819 run()
828
820
829 if 'i' in opts:
821 if 'i' in opts:
830 self.shell.user_ns['__name__'] = __name__save
822 self.shell.user_ns['__name__'] = __name__save
831 else:
823 else:
832 # update IPython interactive namespace
824 # update IPython interactive namespace
833
825
834 # Some forms of read errors on the file may mean the
826 # Some forms of read errors on the file may mean the
835 # __name__ key was never set; using pop we don't have to
827 # __name__ key was never set; using pop we don't have to
836 # worry about a possible KeyError.
828 # worry about a possible KeyError.
837 prog_ns.pop('__name__', None)
829 prog_ns.pop('__name__', None)
838
830
839 with preserve_keys(self.shell.user_ns, '__file__'):
831 with preserve_keys(self.shell.user_ns, '__file__'):
840 self.shell.user_ns.update(prog_ns)
832 self.shell.user_ns.update(prog_ns)
841 finally:
833 finally:
842 # It's a bit of a mystery why, but __builtins__ can change from
834 # It's a bit of a mystery why, but __builtins__ can change from
843 # being a module to becoming a dict missing some key data after
835 # being a module to becoming a dict missing some key data after
844 # %run. As best I can see, this is NOT something IPython is doing
836 # %run. As best I can see, this is NOT something IPython is doing
845 # at all, and similar problems have been reported before:
837 # at all, and similar problems have been reported before:
846 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
838 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
847 # Since this seems to be done by the interpreter itself, the best
839 # Since this seems to be done by the interpreter itself, the best
848 # we can do is to at least restore __builtins__ for the user on
840 # we can do is to at least restore __builtins__ for the user on
849 # exit.
841 # exit.
850 self.shell.user_ns['__builtins__'] = builtin_mod
842 self.shell.user_ns['__builtins__'] = builtin_mod
851
843
852 # Ensure key global structures are restored
844 # Ensure key global structures are restored
853 sys.argv = save_argv
845 sys.argv = save_argv
854 if restore_main:
846 if restore_main:
855 sys.modules['__main__'] = restore_main
847 sys.modules['__main__'] = restore_main
856 if '__mp_main__' in sys.modules:
848 if '__mp_main__' in sys.modules:
857 sys.modules['__mp_main__'] = restore_main
849 sys.modules['__mp_main__'] = restore_main
858 else:
850 else:
859 # Remove from sys.modules the reference to main_mod we'd
851 # Remove from sys.modules the reference to main_mod we'd
860 # added. Otherwise it will trap references to objects
852 # added. Otherwise it will trap references to objects
861 # contained therein.
853 # contained therein.
862 del sys.modules[main_mod_name]
854 del sys.modules[main_mod_name]
863
855
864 return stats
856 return stats
865
857
866 def _run_with_debugger(self, code, code_ns, filename=None,
858 def _run_with_debugger(self, code, code_ns, filename=None,
867 bp_line=None, bp_file=None):
859 bp_line=None, bp_file=None):
868 """
860 """
869 Run `code` in debugger with a break point.
861 Run `code` in debugger with a break point.
870
862
871 Parameters
863 Parameters
872 ----------
864 ----------
873 code : str
865 code : str
874 Code to execute.
866 Code to execute.
875 code_ns : dict
867 code_ns : dict
876 A namespace in which `code` is executed.
868 A namespace in which `code` is executed.
877 filename : str
869 filename : str
878 `code` is ran as if it is in `filename`.
870 `code` is ran as if it is in `filename`.
879 bp_line : int, optional
871 bp_line : int, optional
880 Line number of the break point.
872 Line number of the break point.
881 bp_file : str, optional
873 bp_file : str, optional
882 Path to the file in which break point is specified.
874 Path to the file in which break point is specified.
883 `filename` is used if not given.
875 `filename` is used if not given.
884
876
885 Raises
877 Raises
886 ------
878 ------
887 UsageError
879 UsageError
888 If the break point given by `bp_line` is not valid.
880 If the break point given by `bp_line` is not valid.
889
881
890 """
882 """
891 deb = self.shell.InteractiveTB.pdb
883 deb = self.shell.InteractiveTB.pdb
892 if not deb:
884 if not deb:
893 self.shell.InteractiveTB.pdb = self.shell.InteractiveTB.debugger_cls()
885 self.shell.InteractiveTB.pdb = self.shell.InteractiveTB.debugger_cls()
894 deb = self.shell.InteractiveTB.pdb
886 deb = self.shell.InteractiveTB.pdb
895
887
896 # deb.checkline() fails if deb.curframe exists but is None; it can
888 # deb.checkline() fails if deb.curframe exists but is None; it can
897 # handle it not existing. https://github.com/ipython/ipython/issues/10028
889 # handle it not existing. https://github.com/ipython/ipython/issues/10028
898 if hasattr(deb, 'curframe'):
890 if hasattr(deb, 'curframe'):
899 del deb.curframe
891 del deb.curframe
900
892
901 # reset Breakpoint state, which is moronically kept
893 # reset Breakpoint state, which is moronically kept
902 # in a class
894 # in a class
903 bdb.Breakpoint.next = 1
895 bdb.Breakpoint.next = 1
904 bdb.Breakpoint.bplist = {}
896 bdb.Breakpoint.bplist = {}
905 bdb.Breakpoint.bpbynumber = [None]
897 bdb.Breakpoint.bpbynumber = [None]
906 deb.clear_all_breaks()
898 deb.clear_all_breaks()
907 if bp_line is not None:
899 if bp_line is not None:
908 # Set an initial breakpoint to stop execution
900 # Set an initial breakpoint to stop execution
909 maxtries = 10
901 maxtries = 10
910 bp_file = bp_file or filename
902 bp_file = bp_file or filename
911 checkline = deb.checkline(bp_file, bp_line)
903 checkline = deb.checkline(bp_file, bp_line)
912 if not checkline:
904 if not checkline:
913 for bp in range(bp_line + 1, bp_line + maxtries + 1):
905 for bp in range(bp_line + 1, bp_line + maxtries + 1):
914 if deb.checkline(bp_file, bp):
906 if deb.checkline(bp_file, bp):
915 break
907 break
916 else:
908 else:
917 msg = ("\nI failed to find a valid line to set "
909 msg = ("\nI failed to find a valid line to set "
918 "a breakpoint\n"
910 "a breakpoint\n"
919 "after trying up to line: %s.\n"
911 "after trying up to line: %s.\n"
920 "Please set a valid breakpoint manually "
912 "Please set a valid breakpoint manually "
921 "with the -b option." % bp)
913 "with the -b option." % bp)
922 raise UsageError(msg)
914 raise UsageError(msg)
923 # if we find a good linenumber, set the breakpoint
915 # if we find a good linenumber, set the breakpoint
924 deb.do_break('%s:%s' % (bp_file, bp_line))
916 deb.do_break('%s:%s' % (bp_file, bp_line))
925
917
926 if filename:
918 if filename:
927 # Mimic Pdb._runscript(...)
919 # Mimic Pdb._runscript(...)
928 deb._wait_for_mainpyfile = True
920 deb._wait_for_mainpyfile = True
929 deb.mainpyfile = deb.canonic(filename)
921 deb.mainpyfile = deb.canonic(filename)
930
922
931 # Start file run
923 # Start file run
932 print("NOTE: Enter 'c' at the %s prompt to continue execution." % deb.prompt)
924 print("NOTE: Enter 'c' at the %s prompt to continue execution." % deb.prompt)
933 try:
925 try:
934 if filename:
926 if filename:
935 # save filename so it can be used by methods on the deb object
927 # save filename so it can be used by methods on the deb object
936 deb._exec_filename = filename
928 deb._exec_filename = filename
937 while True:
929 while True:
938 try:
930 try:
939 trace = sys.gettrace()
931 trace = sys.gettrace()
940 deb.run(code, code_ns)
932 deb.run(code, code_ns)
941 except Restart:
933 except Restart:
942 print("Restarting")
934 print("Restarting")
943 if filename:
935 if filename:
944 deb._wait_for_mainpyfile = True
936 deb._wait_for_mainpyfile = True
945 deb.mainpyfile = deb.canonic(filename)
937 deb.mainpyfile = deb.canonic(filename)
946 continue
938 continue
947 else:
939 else:
948 break
940 break
949 finally:
941 finally:
950 sys.settrace(trace)
942 sys.settrace(trace)
951
943
952
944
953 except:
945 except:
954 etype, value, tb = sys.exc_info()
946 etype, value, tb = sys.exc_info()
955 # Skip three frames in the traceback: the %run one,
947 # Skip three frames in the traceback: the %run one,
956 # one inside bdb.py, and the command-line typed by the
948 # one inside bdb.py, and the command-line typed by the
957 # user (run by exec in pdb itself).
949 # user (run by exec in pdb itself).
958 self.shell.InteractiveTB(etype, value, tb, tb_offset=3)
950 self.shell.InteractiveTB(etype, value, tb, tb_offset=3)
959
951
960 @staticmethod
952 @staticmethod
961 def _run_with_timing(run, nruns):
953 def _run_with_timing(run, nruns):
962 """
954 """
963 Run function `run` and print timing information.
955 Run function `run` and print timing information.
964
956
965 Parameters
957 Parameters
966 ----------
958 ----------
967 run : callable
959 run : callable
968 Any callable object which takes no argument.
960 Any callable object which takes no argument.
969 nruns : int
961 nruns : int
970 Number of times to execute `run`.
962 Number of times to execute `run`.
971
963
972 """
964 """
973 twall0 = time.perf_counter()
965 twall0 = time.perf_counter()
974 if nruns == 1:
966 if nruns == 1:
975 t0 = clock2()
967 t0 = clock2()
976 run()
968 run()
977 t1 = clock2()
969 t1 = clock2()
978 t_usr = t1[0] - t0[0]
970 t_usr = t1[0] - t0[0]
979 t_sys = t1[1] - t0[1]
971 t_sys = t1[1] - t0[1]
980 print("\nIPython CPU timings (estimated):")
972 print("\nIPython CPU timings (estimated):")
981 print(" User : %10.2f s." % t_usr)
973 print(" User : %10.2f s." % t_usr)
982 print(" System : %10.2f s." % t_sys)
974 print(" System : %10.2f s." % t_sys)
983 else:
975 else:
984 runs = range(nruns)
976 runs = range(nruns)
985 t0 = clock2()
977 t0 = clock2()
986 for nr in runs:
978 for nr in runs:
987 run()
979 run()
988 t1 = clock2()
980 t1 = clock2()
989 t_usr = t1[0] - t0[0]
981 t_usr = t1[0] - t0[0]
990 t_sys = t1[1] - t0[1]
982 t_sys = t1[1] - t0[1]
991 print("\nIPython CPU timings (estimated):")
983 print("\nIPython CPU timings (estimated):")
992 print("Total runs performed:", nruns)
984 print("Total runs performed:", nruns)
993 print(" Times : %10s %10s" % ('Total', 'Per run'))
985 print(" Times : %10s %10s" % ('Total', 'Per run'))
994 print(" User : %10.2f s, %10.2f s." % (t_usr, t_usr / nruns))
986 print(" User : %10.2f s, %10.2f s." % (t_usr, t_usr / nruns))
995 print(" System : %10.2f s, %10.2f s." % (t_sys, t_sys / nruns))
987 print(" System : %10.2f s, %10.2f s." % (t_sys, t_sys / nruns))
996 twall1 = time.perf_counter()
988 twall1 = time.perf_counter()
997 print("Wall time: %10.2f s." % (twall1 - twall0))
989 print("Wall time: %10.2f s." % (twall1 - twall0))
998
990
999 @skip_doctest
991 @skip_doctest
1000 @no_var_expand
992 @no_var_expand
1001 @line_cell_magic
993 @line_cell_magic
1002 @needs_local_scope
994 @needs_local_scope
1003 def timeit(self, line='', cell=None, local_ns=None):
995 def timeit(self, line='', cell=None, local_ns=None):
1004 """Time execution of a Python statement or expression
996 """Time execution of a Python statement or expression
1005
997
1006 Usage, in line mode:
998 Usage, in line mode:
1007 %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement
999 %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement
1008 or in cell mode:
1000 or in cell mode:
1009 %%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code
1001 %%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code
1010 code
1002 code
1011 code...
1003 code...
1012
1004
1013 Time execution of a Python statement or expression using the timeit
1005 Time execution of a Python statement or expression using the timeit
1014 module. This function can be used both as a line and cell magic:
1006 module. This function can be used both as a line and cell magic:
1015
1007
1016 - In line mode you can time a single-line statement (though multiple
1008 - In line mode you can time a single-line statement (though multiple
1017 ones can be chained with using semicolons).
1009 ones can be chained with using semicolons).
1018
1010
1019 - In cell mode, the statement in the first line is used as setup code
1011 - In cell mode, the statement in the first line is used as setup code
1020 (executed but not timed) and the body of the cell is timed. The cell
1012 (executed but not timed) and the body of the cell is timed. The cell
1021 body has access to any variables created in the setup code.
1013 body has access to any variables created in the setup code.
1022
1014
1023 Options:
1015 Options:
1024 -n<N>: execute the given statement <N> times in a loop. If <N> is not
1016 -n<N>: execute the given statement <N> times in a loop. If <N> is not
1025 provided, <N> is determined so as to get sufficient accuracy.
1017 provided, <N> is determined so as to get sufficient accuracy.
1026
1018
1027 -r<R>: number of repeats <R>, each consisting of <N> loops, and take the
1019 -r<R>: number of repeats <R>, each consisting of <N> loops, and take the
1028 best result.
1020 best result.
1029 Default: 7
1021 Default: 7
1030
1022
1031 -t: use time.time to measure the time, which is the default on Unix.
1023 -t: use time.time to measure the time, which is the default on Unix.
1032 This function measures wall time.
1024 This function measures wall time.
1033
1025
1034 -c: use time.clock to measure the time, which is the default on
1026 -c: use time.clock to measure the time, which is the default on
1035 Windows and measures wall time. On Unix, resource.getrusage is used
1027 Windows and measures wall time. On Unix, resource.getrusage is used
1036 instead and returns the CPU user time.
1028 instead and returns the CPU user time.
1037
1029
1038 -p<P>: use a precision of <P> digits to display the timing result.
1030 -p<P>: use a precision of <P> digits to display the timing result.
1039 Default: 3
1031 Default: 3
1040
1032
1041 -q: Quiet, do not print result.
1033 -q: Quiet, do not print result.
1042
1034
1043 -o: return a TimeitResult that can be stored in a variable to inspect
1035 -o: return a TimeitResult that can be stored in a variable to inspect
1044 the result in more details.
1036 the result in more details.
1045
1037
1046 .. versionchanged:: 7.3
1038 .. versionchanged:: 7.3
1047 User variables are no longer expanded,
1039 User variables are no longer expanded,
1048 the magic line is always left unmodified.
1040 the magic line is always left unmodified.
1049
1041
1050 Examples
1042 Examples
1051 --------
1043 --------
1052 ::
1044 ::
1053
1045
1054 In [1]: %timeit pass
1046 In [1]: %timeit pass
1055 8.26 ns ± 0.12 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
1047 8.26 ns ± 0.12 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
1056
1048
1057 In [2]: u = None
1049 In [2]: u = None
1058
1050
1059 In [3]: %timeit u is None
1051 In [3]: %timeit u is None
1060 29.9 ns ± 0.643 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
1052 29.9 ns ± 0.643 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
1061
1053
1062 In [4]: %timeit -r 4 u == None
1054 In [4]: %timeit -r 4 u == None
1063
1055
1064 In [5]: import time
1056 In [5]: import time
1065
1057
1066 In [6]: %timeit -n1 time.sleep(2)
1058 In [6]: %timeit -n1 time.sleep(2)
1067
1059
1068
1060
1069 The times reported by %timeit will be slightly higher than those
1061 The times reported by %timeit will be slightly higher than those
1070 reported by the timeit.py script when variables are accessed. This is
1062 reported by the timeit.py script when variables are accessed. This is
1071 due to the fact that %timeit executes the statement in the namespace
1063 due to the fact that %timeit executes the statement in the namespace
1072 of the shell, compared with timeit.py, which uses a single setup
1064 of the shell, compared with timeit.py, which uses a single setup
1073 statement to import function or create variables. Generally, the bias
1065 statement to import function or create variables. Generally, the bias
1074 does not matter as long as results from timeit.py are not mixed with
1066 does not matter as long as results from timeit.py are not mixed with
1075 those from %timeit."""
1067 those from %timeit."""
1076
1068
1077 opts, stmt = self.parse_options(line,'n:r:tcp:qo',
1069 opts, stmt = self.parse_options(line,'n:r:tcp:qo',
1078 posix=False, strict=False)
1070 posix=False, strict=False)
1079 if stmt == "" and cell is None:
1071 if stmt == "" and cell is None:
1080 return
1072 return
1081
1073
1082 timefunc = timeit.default_timer
1074 timefunc = timeit.default_timer
1083 number = int(getattr(opts, "n", 0))
1075 number = int(getattr(opts, "n", 0))
1084 default_repeat = 7 if timeit.default_repeat < 7 else timeit.default_repeat
1076 default_repeat = 7 if timeit.default_repeat < 7 else timeit.default_repeat
1085 repeat = int(getattr(opts, "r", default_repeat))
1077 repeat = int(getattr(opts, "r", default_repeat))
1086 precision = int(getattr(opts, "p", 3))
1078 precision = int(getattr(opts, "p", 3))
1087 quiet = 'q' in opts
1079 quiet = 'q' in opts
1088 return_result = 'o' in opts
1080 return_result = 'o' in opts
1089 if hasattr(opts, "t"):
1081 if hasattr(opts, "t"):
1090 timefunc = time.time
1082 timefunc = time.time
1091 if hasattr(opts, "c"):
1083 if hasattr(opts, "c"):
1092 timefunc = clock
1084 timefunc = clock
1093
1085
1094 timer = Timer(timer=timefunc)
1086 timer = Timer(timer=timefunc)
1095 # this code has tight coupling to the inner workings of timeit.Timer,
1087 # this code has tight coupling to the inner workings of timeit.Timer,
1096 # but is there a better way to achieve that the code stmt has access
1088 # but is there a better way to achieve that the code stmt has access
1097 # to the shell namespace?
1089 # to the shell namespace?
1098 transform = self.shell.transform_cell
1090 transform = self.shell.transform_cell
1099
1091
1100 if cell is None:
1092 if cell is None:
1101 # called as line magic
1093 # called as line magic
1102 ast_setup = self.shell.compile.ast_parse("pass")
1094 ast_setup = self.shell.compile.ast_parse("pass")
1103 ast_stmt = self.shell.compile.ast_parse(transform(stmt))
1095 ast_stmt = self.shell.compile.ast_parse(transform(stmt))
1104 else:
1096 else:
1105 ast_setup = self.shell.compile.ast_parse(transform(stmt))
1097 ast_setup = self.shell.compile.ast_parse(transform(stmt))
1106 ast_stmt = self.shell.compile.ast_parse(transform(cell))
1098 ast_stmt = self.shell.compile.ast_parse(transform(cell))
1107
1099
1108 ast_setup = self.shell.transform_ast(ast_setup)
1100 ast_setup = self.shell.transform_ast(ast_setup)
1109 ast_stmt = self.shell.transform_ast(ast_stmt)
1101 ast_stmt = self.shell.transform_ast(ast_stmt)
1110
1102
1111 # Check that these compile to valid Python code *outside* the timer func
1103 # Check that these compile to valid Python code *outside* the timer func
1112 # Invalid code may become valid when put inside the function & loop,
1104 # Invalid code may become valid when put inside the function & loop,
1113 # which messes up error messages.
1105 # which messes up error messages.
1114 # https://github.com/ipython/ipython/issues/10636
1106 # https://github.com/ipython/ipython/issues/10636
1115 self.shell.compile(ast_setup, "<magic-timeit-setup>", "exec")
1107 self.shell.compile(ast_setup, "<magic-timeit-setup>", "exec")
1116 self.shell.compile(ast_stmt, "<magic-timeit-stmt>", "exec")
1108 self.shell.compile(ast_stmt, "<magic-timeit-stmt>", "exec")
1117
1109
1118 # This codestring is taken from timeit.template - we fill it in as an
1110 # This codestring is taken from timeit.template - we fill it in as an
1119 # AST, so that we can apply our AST transformations to the user code
1111 # AST, so that we can apply our AST transformations to the user code
1120 # without affecting the timing code.
1112 # without affecting the timing code.
1121 timeit_ast_template = ast.parse('def inner(_it, _timer):\n'
1113 timeit_ast_template = ast.parse('def inner(_it, _timer):\n'
1122 ' setup\n'
1114 ' setup\n'
1123 ' _t0 = _timer()\n'
1115 ' _t0 = _timer()\n'
1124 ' for _i in _it:\n'
1116 ' for _i in _it:\n'
1125 ' stmt\n'
1117 ' stmt\n'
1126 ' _t1 = _timer()\n'
1118 ' _t1 = _timer()\n'
1127 ' return _t1 - _t0\n')
1119 ' return _t1 - _t0\n')
1128
1120
1129 timeit_ast = TimeitTemplateFiller(ast_setup, ast_stmt).visit(timeit_ast_template)
1121 timeit_ast = TimeitTemplateFiller(ast_setup, ast_stmt).visit(timeit_ast_template)
1130 timeit_ast = ast.fix_missing_locations(timeit_ast)
1122 timeit_ast = ast.fix_missing_locations(timeit_ast)
1131
1123
1132 # Track compilation time so it can be reported if too long
1124 # Track compilation time so it can be reported if too long
1133 # Minimum time above which compilation time will be reported
1125 # Minimum time above which compilation time will be reported
1134 tc_min = 0.1
1126 tc_min = 0.1
1135
1127
1136 t0 = clock()
1128 t0 = clock()
1137 code = self.shell.compile(timeit_ast, "<magic-timeit>", "exec")
1129 code = self.shell.compile(timeit_ast, "<magic-timeit>", "exec")
1138 tc = clock()-t0
1130 tc = clock()-t0
1139
1131
1140 ns = {}
1132 ns = {}
1141 glob = self.shell.user_ns
1133 glob = self.shell.user_ns
1142 # handles global vars with same name as local vars. We store them in conflict_globs.
1134 # handles global vars with same name as local vars. We store them in conflict_globs.
1143 conflict_globs = {}
1135 conflict_globs = {}
1144 if local_ns and cell is None:
1136 if local_ns and cell is None:
1145 for var_name, var_val in glob.items():
1137 for var_name, var_val in glob.items():
1146 if var_name in local_ns:
1138 if var_name in local_ns:
1147 conflict_globs[var_name] = var_val
1139 conflict_globs[var_name] = var_val
1148 glob.update(local_ns)
1140 glob.update(local_ns)
1149
1141
1150 exec(code, glob, ns)
1142 exec(code, glob, ns)
1151 timer.inner = ns["inner"]
1143 timer.inner = ns["inner"]
1152
1144
1153 # This is used to check if there is a huge difference between the
1145 # This is used to check if there is a huge difference between the
1154 # best and worst timings.
1146 # best and worst timings.
1155 # Issue: https://github.com/ipython/ipython/issues/6471
1147 # Issue: https://github.com/ipython/ipython/issues/6471
1156 if number == 0:
1148 if number == 0:
1157 # determine number so that 0.2 <= total time < 2.0
1149 # determine number so that 0.2 <= total time < 2.0
1158 for index in range(0, 10):
1150 for index in range(0, 10):
1159 number = 10 ** index
1151 number = 10 ** index
1160 time_number = timer.timeit(number)
1152 time_number = timer.timeit(number)
1161 if time_number >= 0.2:
1153 if time_number >= 0.2:
1162 break
1154 break
1163
1155
1164 all_runs = timer.repeat(repeat, number)
1156 all_runs = timer.repeat(repeat, number)
1165 best = min(all_runs) / number
1157 best = min(all_runs) / number
1166 worst = max(all_runs) / number
1158 worst = max(all_runs) / number
1167 timeit_result = TimeitResult(number, repeat, best, worst, all_runs, tc, precision)
1159 timeit_result = TimeitResult(number, repeat, best, worst, all_runs, tc, precision)
1168
1160
1169 # Restore global vars from conflict_globs
1161 # Restore global vars from conflict_globs
1170 if conflict_globs:
1162 if conflict_globs:
1171 glob.update(conflict_globs)
1163 glob.update(conflict_globs)
1172
1164
1173 if not quiet :
1165 if not quiet :
1174 # Check best timing is greater than zero to avoid a
1166 # Check best timing is greater than zero to avoid a
1175 # ZeroDivisionError.
1167 # ZeroDivisionError.
1176 # In cases where the slowest timing is lesser than a microsecond
1168 # In cases where the slowest timing is lesser than a microsecond
1177 # we assume that it does not really matter if the fastest
1169 # we assume that it does not really matter if the fastest
1178 # timing is 4 times faster than the slowest timing or not.
1170 # timing is 4 times faster than the slowest timing or not.
1179 if worst > 4 * best and best > 0 and worst > 1e-6:
1171 if worst > 4 * best and best > 0 and worst > 1e-6:
1180 print("The slowest run took %0.2f times longer than the "
1172 print("The slowest run took %0.2f times longer than the "
1181 "fastest. This could mean that an intermediate result "
1173 "fastest. This could mean that an intermediate result "
1182 "is being cached." % (worst / best))
1174 "is being cached." % (worst / best))
1183
1175
1184 print( timeit_result )
1176 print( timeit_result )
1185
1177
1186 if tc > tc_min:
1178 if tc > tc_min:
1187 print("Compiler time: %.2f s" % tc)
1179 print("Compiler time: %.2f s" % tc)
1188 if return_result:
1180 if return_result:
1189 return timeit_result
1181 return timeit_result
1190
1182
1191 @skip_doctest
1183 @skip_doctest
1192 @no_var_expand
1184 @no_var_expand
1193 @needs_local_scope
1185 @needs_local_scope
1194 @line_cell_magic
1186 @line_cell_magic
1195 def time(self,line='', cell=None, local_ns=None):
1187 def time(self,line='', cell=None, local_ns=None):
1196 """Time execution of a Python statement or expression.
1188 """Time execution of a Python statement or expression.
1197
1189
1198 The CPU and wall clock times are printed, and the value of the
1190 The CPU and wall clock times are printed, and the value of the
1199 expression (if any) is returned. Note that under Win32, system time
1191 expression (if any) is returned. Note that under Win32, system time
1200 is always reported as 0, since it can not be measured.
1192 is always reported as 0, since it can not be measured.
1201
1193
1202 This function can be used both as a line and cell magic:
1194 This function can be used both as a line and cell magic:
1203
1195
1204 - In line mode you can time a single-line statement (though multiple
1196 - In line mode you can time a single-line statement (though multiple
1205 ones can be chained with using semicolons).
1197 ones can be chained with using semicolons).
1206
1198
1207 - In cell mode, you can time the cell body (a directly
1199 - In cell mode, you can time the cell body (a directly
1208 following statement raises an error).
1200 following statement raises an error).
1209
1201
1210 This function provides very basic timing functionality. Use the timeit
1202 This function provides very basic timing functionality. Use the timeit
1211 magic for more control over the measurement.
1203 magic for more control over the measurement.
1212
1204
1213 .. versionchanged:: 7.3
1205 .. versionchanged:: 7.3
1214 User variables are no longer expanded,
1206 User variables are no longer expanded,
1215 the magic line is always left unmodified.
1207 the magic line is always left unmodified.
1216
1208
1217 Examples
1209 Examples
1218 --------
1210 --------
1219 ::
1211 ::
1220
1212
1221 In [1]: %time 2**128
1213 In [1]: %time 2**128
1222 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1214 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1223 Wall time: 0.00
1215 Wall time: 0.00
1224 Out[1]: 340282366920938463463374607431768211456L
1216 Out[1]: 340282366920938463463374607431768211456L
1225
1217
1226 In [2]: n = 1000000
1218 In [2]: n = 1000000
1227
1219
1228 In [3]: %time sum(range(n))
1220 In [3]: %time sum(range(n))
1229 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1221 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1230 Wall time: 1.37
1222 Wall time: 1.37
1231 Out[3]: 499999500000L
1223 Out[3]: 499999500000L
1232
1224
1233 In [4]: %time print 'hello world'
1225 In [4]: %time print 'hello world'
1234 hello world
1226 hello world
1235 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1227 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1236 Wall time: 0.00
1228 Wall time: 0.00
1237
1229
1238 Note that the time needed by Python to compile the given expression
1230 Note that the time needed by Python to compile the given expression
1239 will be reported if it is more than 0.1s. In this example, the
1231 will be reported if it is more than 0.1s. In this example, the
1240 actual exponentiation is done by Python at compilation time, so while
1232 actual exponentiation is done by Python at compilation time, so while
1241 the expression can take a noticeable amount of time to compute, that
1233 the expression can take a noticeable amount of time to compute, that
1242 time is purely due to the compilation:
1234 time is purely due to the compilation:
1243
1235
1244 In [5]: %time 3**9999;
1236 In [5]: %time 3**9999;
1245 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1237 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1246 Wall time: 0.00 s
1238 Wall time: 0.00 s
1247
1239
1248 In [6]: %time 3**999999;
1240 In [6]: %time 3**999999;
1249 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1241 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1250 Wall time: 0.00 s
1242 Wall time: 0.00 s
1251 Compiler : 0.78 s
1243 Compiler : 0.78 s
1252 """
1244 """
1253
1245
1254 # fail immediately if the given expression can't be compiled
1246 # fail immediately if the given expression can't be compiled
1255
1247
1256 if line and cell:
1248 if line and cell:
1257 raise UsageError("Can't use statement directly after '%%time'!")
1249 raise UsageError("Can't use statement directly after '%%time'!")
1258
1250
1259 if cell:
1251 if cell:
1260 expr = self.shell.transform_cell(cell)
1252 expr = self.shell.transform_cell(cell)
1261 else:
1253 else:
1262 expr = self.shell.transform_cell(line)
1254 expr = self.shell.transform_cell(line)
1263
1255
1264 # Minimum time above which parse time will be reported
1256 # Minimum time above which parse time will be reported
1265 tp_min = 0.1
1257 tp_min = 0.1
1266
1258
1267 t0 = clock()
1259 t0 = clock()
1268 expr_ast = self.shell.compile.ast_parse(expr)
1260 expr_ast = self.shell.compile.ast_parse(expr)
1269 tp = clock()-t0
1261 tp = clock()-t0
1270
1262
1271 # Apply AST transformations
1263 # Apply AST transformations
1272 expr_ast = self.shell.transform_ast(expr_ast)
1264 expr_ast = self.shell.transform_ast(expr_ast)
1273
1265
1274 # Minimum time above which compilation time will be reported
1266 # Minimum time above which compilation time will be reported
1275 tc_min = 0.1
1267 tc_min = 0.1
1276
1268
1277 expr_val=None
1269 expr_val=None
1278 if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
1270 if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
1279 mode = 'eval'
1271 mode = 'eval'
1280 source = '<timed eval>'
1272 source = '<timed eval>'
1281 expr_ast = ast.Expression(expr_ast.body[0].value)
1273 expr_ast = ast.Expression(expr_ast.body[0].value)
1282 else:
1274 else:
1283 mode = 'exec'
1275 mode = 'exec'
1284 source = '<timed exec>'
1276 source = '<timed exec>'
1285 # multi-line %%time case
1277 # multi-line %%time case
1286 if len(expr_ast.body) > 1 and isinstance(expr_ast.body[-1], ast.Expr):
1278 if len(expr_ast.body) > 1 and isinstance(expr_ast.body[-1], ast.Expr):
1287 expr_val= expr_ast.body[-1]
1279 expr_val= expr_ast.body[-1]
1288 expr_ast = expr_ast.body[:-1]
1280 expr_ast = expr_ast.body[:-1]
1289 expr_ast = Module(expr_ast, [])
1281 expr_ast = Module(expr_ast, [])
1290 expr_val = ast.Expression(expr_val.value)
1282 expr_val = ast.Expression(expr_val.value)
1291
1283
1292 t0 = clock()
1284 t0 = clock()
1293 code = self.shell.compile(expr_ast, source, mode)
1285 code = self.shell.compile(expr_ast, source, mode)
1294 tc = clock()-t0
1286 tc = clock()-t0
1295
1287
1296 # skew measurement as little as possible
1288 # skew measurement as little as possible
1297 glob = self.shell.user_ns
1289 glob = self.shell.user_ns
1298 wtime = time.time
1290 wtime = time.time
1299 # time execution
1291 # time execution
1300 wall_st = wtime()
1292 wall_st = wtime()
1301 if mode=='eval':
1293 if mode=='eval':
1302 st = clock2()
1294 st = clock2()
1303 try:
1295 try:
1304 out = eval(code, glob, local_ns)
1296 out = eval(code, glob, local_ns)
1305 except:
1297 except:
1306 self.shell.showtraceback()
1298 self.shell.showtraceback()
1307 return
1299 return
1308 end = clock2()
1300 end = clock2()
1309 else:
1301 else:
1310 st = clock2()
1302 st = clock2()
1311 try:
1303 try:
1312 exec(code, glob, local_ns)
1304 exec(code, glob, local_ns)
1313 out=None
1305 out=None
1314 # multi-line %%time case
1306 # multi-line %%time case
1315 if expr_val is not None:
1307 if expr_val is not None:
1316 code_2 = self.shell.compile(expr_val, source, 'eval')
1308 code_2 = self.shell.compile(expr_val, source, 'eval')
1317 out = eval(code_2, glob, local_ns)
1309 out = eval(code_2, glob, local_ns)
1318 except:
1310 except:
1319 self.shell.showtraceback()
1311 self.shell.showtraceback()
1320 return
1312 return
1321 end = clock2()
1313 end = clock2()
1322
1314
1323 wall_end = wtime()
1315 wall_end = wtime()
1324 # Compute actual times and report
1316 # Compute actual times and report
1325 wall_time = wall_end-wall_st
1317 wall_time = wall_end-wall_st
1326 cpu_user = end[0]-st[0]
1318 cpu_user = end[0]-st[0]
1327 cpu_sys = end[1]-st[1]
1319 cpu_sys = end[1]-st[1]
1328 cpu_tot = cpu_user+cpu_sys
1320 cpu_tot = cpu_user+cpu_sys
1329 # On windows cpu_sys is always zero, so no new information to the next print
1321 # On windows cpu_sys is always zero, so no new information to the next print
1330 if sys.platform != 'win32':
1322 if sys.platform != 'win32':
1331 print("CPU times: user %s, sys: %s, total: %s" % \
1323 print("CPU times: user %s, sys: %s, total: %s" % \
1332 (_format_time(cpu_user),_format_time(cpu_sys),_format_time(cpu_tot)))
1324 (_format_time(cpu_user),_format_time(cpu_sys),_format_time(cpu_tot)))
1333 print("Wall time: %s" % _format_time(wall_time))
1325 print("Wall time: %s" % _format_time(wall_time))
1334 if tc > tc_min:
1326 if tc > tc_min:
1335 print("Compiler : %s" % _format_time(tc))
1327 print("Compiler : %s" % _format_time(tc))
1336 if tp > tp_min:
1328 if tp > tp_min:
1337 print("Parser : %s" % _format_time(tp))
1329 print("Parser : %s" % _format_time(tp))
1338 return out
1330 return out
1339
1331
1340 @skip_doctest
1332 @skip_doctest
1341 @line_magic
1333 @line_magic
1342 def macro(self, parameter_s=''):
1334 def macro(self, parameter_s=''):
1343 """Define a macro for future re-execution. It accepts ranges of history,
1335 """Define a macro for future re-execution. It accepts ranges of history,
1344 filenames or string objects.
1336 filenames or string objects.
1345
1337
1346 Usage:\\
1338 Usage:\\
1347 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1339 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1348
1340
1349 Options:
1341 Options:
1350
1342
1351 -r: use 'raw' input. By default, the 'processed' history is used,
1343 -r: use 'raw' input. By default, the 'processed' history is used,
1352 so that magics are loaded in their transformed version to valid
1344 so that magics are loaded in their transformed version to valid
1353 Python. If this option is given, the raw input as typed at the
1345 Python. If this option is given, the raw input as typed at the
1354 command line is used instead.
1346 command line is used instead.
1355
1347
1356 -q: quiet macro definition. By default, a tag line is printed
1348 -q: quiet macro definition. By default, a tag line is printed
1357 to indicate the macro has been created, and then the contents of
1349 to indicate the macro has been created, and then the contents of
1358 the macro are printed. If this option is given, then no printout
1350 the macro are printed. If this option is given, then no printout
1359 is produced once the macro is created.
1351 is produced once the macro is created.
1360
1352
1361 This will define a global variable called `name` which is a string
1353 This will define a global variable called `name` which is a string
1362 made of joining the slices and lines you specify (n1,n2,... numbers
1354 made of joining the slices and lines you specify (n1,n2,... numbers
1363 above) from your input history into a single string. This variable
1355 above) from your input history into a single string. This variable
1364 acts like an automatic function which re-executes those lines as if
1356 acts like an automatic function which re-executes those lines as if
1365 you had typed them. You just type 'name' at the prompt and the code
1357 you had typed them. You just type 'name' at the prompt and the code
1366 executes.
1358 executes.
1367
1359
1368 The syntax for indicating input ranges is described in %history.
1360 The syntax for indicating input ranges is described in %history.
1369
1361
1370 Note: as a 'hidden' feature, you can also use traditional python slice
1362 Note: as a 'hidden' feature, you can also use traditional python slice
1371 notation, where N:M means numbers N through M-1.
1363 notation, where N:M means numbers N through M-1.
1372
1364
1373 For example, if your history contains (print using %hist -n )::
1365 For example, if your history contains (print using %hist -n )::
1374
1366
1375 44: x=1
1367 44: x=1
1376 45: y=3
1368 45: y=3
1377 46: z=x+y
1369 46: z=x+y
1378 47: print x
1370 47: print x
1379 48: a=5
1371 48: a=5
1380 49: print 'x',x,'y',y
1372 49: print 'x',x,'y',y
1381
1373
1382 you can create a macro with lines 44 through 47 (included) and line 49
1374 you can create a macro with lines 44 through 47 (included) and line 49
1383 called my_macro with::
1375 called my_macro with::
1384
1376
1385 In [55]: %macro my_macro 44-47 49
1377 In [55]: %macro my_macro 44-47 49
1386
1378
1387 Now, typing `my_macro` (without quotes) will re-execute all this code
1379 Now, typing `my_macro` (without quotes) will re-execute all this code
1388 in one pass.
1380 in one pass.
1389
1381
1390 You don't need to give the line-numbers in order, and any given line
1382 You don't need to give the line-numbers in order, and any given line
1391 number can appear multiple times. You can assemble macros with any
1383 number can appear multiple times. You can assemble macros with any
1392 lines from your input history in any order.
1384 lines from your input history in any order.
1393
1385
1394 The macro is a simple object which holds its value in an attribute,
1386 The macro is a simple object which holds its value in an attribute,
1395 but IPython's display system checks for macros and executes them as
1387 but IPython's display system checks for macros and executes them as
1396 code instead of printing them when you type their name.
1388 code instead of printing them when you type their name.
1397
1389
1398 You can view a macro's contents by explicitly printing it with::
1390 You can view a macro's contents by explicitly printing it with::
1399
1391
1400 print macro_name
1392 print macro_name
1401
1393
1402 """
1394 """
1403 opts,args = self.parse_options(parameter_s,'rq',mode='list')
1395 opts,args = self.parse_options(parameter_s,'rq',mode='list')
1404 if not args: # List existing macros
1396 if not args: # List existing macros
1405 return sorted(k for k,v in self.shell.user_ns.items() if isinstance(v, Macro))
1397 return sorted(k for k,v in self.shell.user_ns.items() if isinstance(v, Macro))
1406 if len(args) == 1:
1398 if len(args) == 1:
1407 raise UsageError(
1399 raise UsageError(
1408 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1400 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1409 name, codefrom = args[0], " ".join(args[1:])
1401 name, codefrom = args[0], " ".join(args[1:])
1410
1402
1411 #print 'rng',ranges # dbg
1403 #print 'rng',ranges # dbg
1412 try:
1404 try:
1413 lines = self.shell.find_user_code(codefrom, 'r' in opts)
1405 lines = self.shell.find_user_code(codefrom, 'r' in opts)
1414 except (ValueError, TypeError) as e:
1406 except (ValueError, TypeError) as e:
1415 print(e.args[0])
1407 print(e.args[0])
1416 return
1408 return
1417 macro = Macro(lines)
1409 macro = Macro(lines)
1418 self.shell.define_macro(name, macro)
1410 self.shell.define_macro(name, macro)
1419 if not ( 'q' in opts) :
1411 if not ( 'q' in opts) :
1420 print('Macro `%s` created. To execute, type its name (without quotes).' % name)
1412 print('Macro `%s` created. To execute, type its name (without quotes).' % name)
1421 print('=== Macro contents: ===')
1413 print('=== Macro contents: ===')
1422 print(macro, end=' ')
1414 print(macro, end=' ')
1423
1415
1424 @magic_arguments.magic_arguments()
1416 @magic_arguments.magic_arguments()
1425 @magic_arguments.argument('output', type=str, default='', nargs='?',
1417 @magic_arguments.argument('output', type=str, default='', nargs='?',
1426 help="""The name of the variable in which to store output.
1418 help="""The name of the variable in which to store output.
1427 This is a utils.io.CapturedIO object with stdout/err attributes
1419 This is a utils.io.CapturedIO object with stdout/err attributes
1428 for the text of the captured output.
1420 for the text of the captured output.
1429
1421
1430 CapturedOutput also has a show() method for displaying the output,
1422 CapturedOutput also has a show() method for displaying the output,
1431 and __call__ as well, so you can use that to quickly display the
1423 and __call__ as well, so you can use that to quickly display the
1432 output.
1424 output.
1433
1425
1434 If unspecified, captured output is discarded.
1426 If unspecified, captured output is discarded.
1435 """
1427 """
1436 )
1428 )
1437 @magic_arguments.argument('--no-stderr', action="store_true",
1429 @magic_arguments.argument('--no-stderr', action="store_true",
1438 help="""Don't capture stderr."""
1430 help="""Don't capture stderr."""
1439 )
1431 )
1440 @magic_arguments.argument('--no-stdout', action="store_true",
1432 @magic_arguments.argument('--no-stdout', action="store_true",
1441 help="""Don't capture stdout."""
1433 help="""Don't capture stdout."""
1442 )
1434 )
1443 @magic_arguments.argument('--no-display', action="store_true",
1435 @magic_arguments.argument('--no-display', action="store_true",
1444 help="""Don't capture IPython's rich display."""
1436 help="""Don't capture IPython's rich display."""
1445 )
1437 )
1446 @cell_magic
1438 @cell_magic
1447 def capture(self, line, cell):
1439 def capture(self, line, cell):
1448 """run the cell, capturing stdout, stderr, and IPython's rich display() calls."""
1440 """run the cell, capturing stdout, stderr, and IPython's rich display() calls."""
1449 args = magic_arguments.parse_argstring(self.capture, line)
1441 args = magic_arguments.parse_argstring(self.capture, line)
1450 out = not args.no_stdout
1442 out = not args.no_stdout
1451 err = not args.no_stderr
1443 err = not args.no_stderr
1452 disp = not args.no_display
1444 disp = not args.no_display
1453 with capture_output(out, err, disp) as io:
1445 with capture_output(out, err, disp) as io:
1454 self.shell.run_cell(cell)
1446 self.shell.run_cell(cell)
1455 if args.output:
1447 if args.output:
1456 self.shell.user_ns[args.output] = io
1448 self.shell.user_ns[args.output] = io
1457
1449
1458 def parse_breakpoint(text, current_file):
1450 def parse_breakpoint(text, current_file):
1459 '''Returns (file, line) for file:line and (current_file, line) for line'''
1451 '''Returns (file, line) for file:line and (current_file, line) for line'''
1460 colon = text.find(':')
1452 colon = text.find(':')
1461 if colon == -1:
1453 if colon == -1:
1462 return current_file, int(text)
1454 return current_file, int(text)
1463 else:
1455 else:
1464 return text[:colon], int(text[colon+1:])
1456 return text[:colon], int(text[colon+1:])
1465
1457
1466 def _format_time(timespan, precision=3):
1458 def _format_time(timespan, precision=3):
1467 """Formats the timespan in a human readable form"""
1459 """Formats the timespan in a human readable form"""
1468
1460
1469 if timespan >= 60.0:
1461 if timespan >= 60.0:
1470 # we have more than a minute, format that in a human readable form
1462 # we have more than a minute, format that in a human readable form
1471 # Idea from http://snipplr.com/view/5713/
1463 # Idea from http://snipplr.com/view/5713/
1472 parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1464 parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1473 time = []
1465 time = []
1474 leftover = timespan
1466 leftover = timespan
1475 for suffix, length in parts:
1467 for suffix, length in parts:
1476 value = int(leftover / length)
1468 value = int(leftover / length)
1477 if value > 0:
1469 if value > 0:
1478 leftover = leftover % length
1470 leftover = leftover % length
1479 time.append(u'%s%s' % (str(value), suffix))
1471 time.append(u'%s%s' % (str(value), suffix))
1480 if leftover < 1:
1472 if leftover < 1:
1481 break
1473 break
1482 return " ".join(time)
1474 return " ".join(time)
1483
1475
1484
1476
1485 # Unfortunately the unicode 'micro' symbol can cause problems in
1477 # Unfortunately the unicode 'micro' symbol can cause problems in
1486 # certain terminals.
1478 # certain terminals.
1487 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1479 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1488 # Try to prevent crashes by being more secure than it needs to
1480 # Try to prevent crashes by being more secure than it needs to
1489 # E.g. eclipse is able to print a µ, but has no sys.stdout.encoding set.
1481 # E.g. eclipse is able to print a µ, but has no sys.stdout.encoding set.
1490 units = [u"s", u"ms",u'us',"ns"] # the save value
1482 units = [u"s", u"ms",u'us',"ns"] # the save value
1491 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
1483 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
1492 try:
1484 try:
1493 u'\xb5'.encode(sys.stdout.encoding)
1485 u'\xb5'.encode(sys.stdout.encoding)
1494 units = [u"s", u"ms",u'\xb5s',"ns"]
1486 units = [u"s", u"ms",u'\xb5s',"ns"]
1495 except:
1487 except:
1496 pass
1488 pass
1497 scaling = [1, 1e3, 1e6, 1e9]
1489 scaling = [1, 1e3, 1e6, 1e9]
1498
1490
1499 if timespan > 0.0:
1491 if timespan > 0.0:
1500 order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1492 order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1501 else:
1493 else:
1502 order = 3
1494 order = 3
1503 return u"%.*g %s" % (precision, timespan * scaling[order], units[order])
1495 return u"%.*g %s" % (precision, timespan * scaling[order], units[order])
General Comments 0
You need to be logged in to leave comments. Login now