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