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