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