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