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