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