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