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