1.. _profile: 2 3******************** 4The Python Profilers 5******************** 6 7**Source code:** :source:`Lib/profile.py` and :source:`Lib/pstats.py` 8 9-------------- 10 11.. _profiler-introduction: 12 13Introduction to the profilers 14============================= 15 16.. index:: 17 single: deterministic profiling 18 single: profiling, deterministic 19 20:mod:`cProfile` and :mod:`profile` provide :dfn:`deterministic profiling` of 21Python programs. A :dfn:`profile` is a set of statistics that describes how 22often and for how long various parts of the program executed. These statistics 23can be formatted into reports via the :mod:`pstats` module. 24 25The Python standard library provides two different implementations of the same 26profiling interface: 27 281. :mod:`cProfile` is recommended for most users; it's a C extension with 29 reasonable overhead that makes it suitable for profiling long-running 30 programs. Based on :mod:`lsprof`, contributed by Brett Rosen and Ted 31 Czotter. 32 332. :mod:`profile`, a pure Python module whose interface is imitated by 34 :mod:`cProfile`, but which adds significant overhead to profiled programs. 35 If you're trying to extend the profiler in some way, the task might be easier 36 with this module. Originally designed and written by Jim Roskind. 37 38.. note:: 39 40 The profiler modules are designed to provide an execution profile for a given 41 program, not for benchmarking purposes (for that, there is :mod:`timeit` for 42 reasonably accurate results). This particularly applies to benchmarking 43 Python code against C code: the profilers introduce overhead for Python code, 44 but not for C-level functions, and so the C code would seem faster than any 45 Python one. 46 47 48.. _profile-instant: 49 50Instant User's Manual 51===================== 52 53This section is provided for users that "don't want to read the manual." It 54provides a very brief overview, and allows a user to rapidly perform profiling 55on an existing application. 56 57To profile a function that takes a single argument, you can do:: 58 59 import cProfile 60 import re 61 cProfile.run('re.compile("foo|bar")') 62 63(Use :mod:`profile` instead of :mod:`cProfile` if the latter is not available on 64your system.) 65 66The above action would run :func:`re.compile` and print profile results like 67the following:: 68 69 214 function calls (207 primitive calls) in 0.002 seconds 70 71 Ordered by: cumulative time 72 73 ncalls tottime percall cumtime percall filename:lineno(function) 74 1 0.000 0.000 0.002 0.002 {built-in method builtins.exec} 75 1 0.000 0.000 0.001 0.001 <string>:1(<module>) 76 1 0.000 0.000 0.001 0.001 __init__.py:250(compile) 77 1 0.000 0.000 0.001 0.001 __init__.py:289(_compile) 78 1 0.000 0.000 0.000 0.000 _compiler.py:759(compile) 79 1 0.000 0.000 0.000 0.000 _parser.py:937(parse) 80 1 0.000 0.000 0.000 0.000 _compiler.py:598(_code) 81 1 0.000 0.000 0.000 0.000 _parser.py:435(_parse_sub) 82 83The first line indicates that 214 calls were monitored. Of those calls, 207 84were :dfn:`primitive`, meaning that the call was not induced via recursion. The 85next line: ``Ordered by: cumulative time``, indicates that the text string in the 86far right column was used to sort the output. The column headings include: 87 88ncalls 89 for the number of calls. 90 91tottime 92 for the total time spent in the given function (and excluding time made in 93 calls to sub-functions) 94 95percall 96 is the quotient of ``tottime`` divided by ``ncalls`` 97 98cumtime 99 is the cumulative time spent in this and all subfunctions (from invocation 100 till exit). This figure is accurate *even* for recursive functions. 101 102percall 103 is the quotient of ``cumtime`` divided by primitive calls 104 105filename:lineno(function) 106 provides the respective data of each function 107 108When there are two numbers in the first column (for example ``3/1``), it means 109that the function recursed. The second value is the number of primitive calls 110and the former is the total number of calls. Note that when the function does 111not recurse, these two values are the same, and only the single figure is 112printed. 113 114Instead of printing the output at the end of the profile run, you can save the 115results to a file by specifying a filename to the :func:`run` function:: 116 117 import cProfile 118 import re 119 cProfile.run('re.compile("foo|bar")', 'restats') 120 121The :class:`pstats.Stats` class reads profile results from a file and formats 122them in various ways. 123 124The files :mod:`cProfile` and :mod:`profile` can also be invoked as a script to 125profile another script. For example:: 126 127 python -m cProfile [-o output_file] [-s sort_order] (-m module | myscript.py) 128 129``-o`` writes the profile results to a file instead of to stdout 130 131``-s`` specifies one of the :func:`~pstats.Stats.sort_stats` sort values to sort 132the output by. This only applies when ``-o`` is not supplied. 133 134``-m`` specifies that a module is being profiled instead of a script. 135 136 .. versionadded:: 3.7 137 Added the ``-m`` option to :mod:`cProfile`. 138 139 .. versionadded:: 3.8 140 Added the ``-m`` option to :mod:`profile`. 141 142The :mod:`pstats` module's :class:`~pstats.Stats` class has a variety of methods 143for manipulating and printing the data saved into a profile results file:: 144 145 import pstats 146 from pstats import SortKey 147 p = pstats.Stats('restats') 148 p.strip_dirs().sort_stats(-1).print_stats() 149 150The :meth:`~pstats.Stats.strip_dirs` method removed the extraneous path from all 151the module names. The :meth:`~pstats.Stats.sort_stats` method sorted all the 152entries according to the standard module/line/name string that is printed. The 153:meth:`~pstats.Stats.print_stats` method printed out all the statistics. You 154might try the following sort calls:: 155 156 p.sort_stats(SortKey.NAME) 157 p.print_stats() 158 159The first call will actually sort the list by function name, and the second call 160will print out the statistics. The following are some interesting calls to 161experiment with:: 162 163 p.sort_stats(SortKey.CUMULATIVE).print_stats(10) 164 165This sorts the profile by cumulative time in a function, and then only prints 166the ten most significant lines. If you want to understand what algorithms are 167taking time, the above line is what you would use. 168 169If you were looking to see what functions were looping a lot, and taking a lot 170of time, you would do:: 171 172 p.sort_stats(SortKey.TIME).print_stats(10) 173 174to sort according to time spent within each function, and then print the 175statistics for the top ten functions. 176 177You might also try:: 178 179 p.sort_stats(SortKey.FILENAME).print_stats('__init__') 180 181This will sort all the statistics by file name, and then print out statistics 182for only the class init methods (since they are spelled with ``__init__`` in 183them). As one final example, you could try:: 184 185 p.sort_stats(SortKey.TIME, SortKey.CUMULATIVE).print_stats(.5, 'init') 186 187This line sorts statistics with a primary key of time, and a secondary key of 188cumulative time, and then prints out some of the statistics. To be specific, the 189list is first culled down to 50% (re: ``.5``) of its original size, then only 190lines containing ``init`` are maintained, and that sub-sub-list is printed. 191 192If you wondered what functions called the above functions, you could now (``p`` 193is still sorted according to the last criteria) do:: 194 195 p.print_callers(.5, 'init') 196 197and you would get a list of callers for each of the listed functions. 198 199If you want more functionality, you're going to have to read the manual, or 200guess what the following functions do:: 201 202 p.print_callees() 203 p.add('restats') 204 205Invoked as a script, the :mod:`pstats` module is a statistics browser for 206reading and examining profile dumps. It has a simple line-oriented interface 207(implemented using :mod:`cmd`) and interactive help. 208 209:mod:`profile` and :mod:`cProfile` Module Reference 210======================================================= 211 212.. module:: cProfile 213.. module:: profile 214 :synopsis: Python source profiler. 215 216Both the :mod:`profile` and :mod:`cProfile` modules provide the following 217functions: 218 219.. function:: run(command, filename=None, sort=-1) 220 221 This function takes a single argument that can be passed to the :func:`exec` 222 function, and an optional file name. In all cases this routine executes:: 223 224 exec(command, __main__.__dict__, __main__.__dict__) 225 226 and gathers profiling statistics from the execution. If no file name is 227 present, then this function automatically creates a :class:`~pstats.Stats` 228 instance and prints a simple profiling report. If the sort value is specified, 229 it is passed to this :class:`~pstats.Stats` instance to control how the 230 results are sorted. 231 232.. function:: runctx(command, globals, locals, filename=None, sort=-1) 233 234 This function is similar to :func:`run`, with added arguments to supply the 235 globals and locals dictionaries for the *command* string. This routine 236 executes:: 237 238 exec(command, globals, locals) 239 240 and gathers profiling statistics as in the :func:`run` function above. 241 242.. class:: Profile(timer=None, timeunit=0.0, subcalls=True, builtins=True) 243 244 This class is normally only used if more precise control over profiling is 245 needed than what the :func:`cProfile.run` function provides. 246 247 A custom timer can be supplied for measuring how long code takes to run via 248 the *timer* argument. This must be a function that returns a single number 249 representing the current time. If the number is an integer, the *timeunit* 250 specifies a multiplier that specifies the duration of each unit of time. For 251 example, if the timer returns times measured in thousands of seconds, the 252 time unit would be ``.001``. 253 254 Directly using the :class:`Profile` class allows formatting profile results 255 without writing the profile data to a file:: 256 257 import cProfile, pstats, io 258 from pstats import SortKey 259 pr = cProfile.Profile() 260 pr.enable() 261 # ... do something ... 262 pr.disable() 263 s = io.StringIO() 264 sortby = SortKey.CUMULATIVE 265 ps = pstats.Stats(pr, stream=s).sort_stats(sortby) 266 ps.print_stats() 267 print(s.getvalue()) 268 269 The :class:`Profile` class can also be used as a context manager (supported 270 only in :mod:`cProfile` module. see :ref:`typecontextmanager`):: 271 272 import cProfile 273 274 with cProfile.Profile() as pr: 275 # ... do something ... 276 277 pr.print_stats() 278 279 .. versionchanged:: 3.8 280 Added context manager support. 281 282 .. method:: enable() 283 284 Start collecting profiling data. Only in :mod:`cProfile`. 285 286 .. method:: disable() 287 288 Stop collecting profiling data. Only in :mod:`cProfile`. 289 290 .. method:: create_stats() 291 292 Stop collecting profiling data and record the results internally 293 as the current profile. 294 295 .. method:: print_stats(sort=-1) 296 297 Create a :class:`~pstats.Stats` object based on the current 298 profile and print the results to stdout. 299 300 .. method:: dump_stats(filename) 301 302 Write the results of the current profile to *filename*. 303 304 .. method:: run(cmd) 305 306 Profile the cmd via :func:`exec`. 307 308 .. method:: runctx(cmd, globals, locals) 309 310 Profile the cmd via :func:`exec` with the specified global and 311 local environment. 312 313 .. method:: runcall(func, /, *args, **kwargs) 314 315 Profile ``func(*args, **kwargs)`` 316 317Note that profiling will only work if the called command/function actually 318returns. If the interpreter is terminated (e.g. via a :func:`sys.exit` call 319during the called command/function execution) no profiling results will be 320printed. 321 322.. _profile-stats: 323 324The :class:`Stats` Class 325======================== 326 327Analysis of the profiler data is done using the :class:`~pstats.Stats` class. 328 329.. module:: pstats 330 :synopsis: Statistics object for use with the profiler. 331 332.. class:: Stats(*filenames or profile, stream=sys.stdout) 333 334 This class constructor creates an instance of a "statistics object" from a 335 *filename* (or list of filenames) or from a :class:`Profile` instance. Output 336 will be printed to the stream specified by *stream*. 337 338 The file selected by the above constructor must have been created by the 339 corresponding version of :mod:`profile` or :mod:`cProfile`. To be specific, 340 there is *no* file compatibility guaranteed with future versions of this 341 profiler, and there is no compatibility with files produced by other 342 profilers, or the same profiler run on a different operating system. If 343 several files are provided, all the statistics for identical functions will 344 be coalesced, so that an overall view of several processes can be considered 345 in a single report. If additional files need to be combined with data in an 346 existing :class:`~pstats.Stats` object, the :meth:`~pstats.Stats.add` method 347 can be used. 348 349 Instead of reading the profile data from a file, a :class:`cProfile.Profile` 350 or :class:`profile.Profile` object can be used as the profile data source. 351 352 :class:`Stats` objects have the following methods: 353 354 .. method:: strip_dirs() 355 356 This method for the :class:`Stats` class removes all leading path 357 information from file names. It is very useful in reducing the size of 358 the printout to fit within (close to) 80 columns. This method modifies 359 the object, and the stripped information is lost. After performing a 360 strip operation, the object is considered to have its entries in a 361 "random" order, as it was just after object initialization and loading. 362 If :meth:`~pstats.Stats.strip_dirs` causes two function names to be 363 indistinguishable (they are on the same line of the same filename, and 364 have the same function name), then the statistics for these two entries 365 are accumulated into a single entry. 366 367 368 .. method:: add(*filenames) 369 370 This method of the :class:`Stats` class accumulates additional profiling 371 information into the current profiling object. Its arguments should refer 372 to filenames created by the corresponding version of :func:`profile.run` 373 or :func:`cProfile.run`. Statistics for identically named (re: file, line, 374 name) functions are automatically accumulated into single function 375 statistics. 376 377 378 .. method:: dump_stats(filename) 379 380 Save the data loaded into the :class:`Stats` object to a file named 381 *filename*. The file is created if it does not exist, and is overwritten 382 if it already exists. This is equivalent to the method of the same name 383 on the :class:`profile.Profile` and :class:`cProfile.Profile` classes. 384 385 386 .. method:: sort_stats(*keys) 387 388 This method modifies the :class:`Stats` object by sorting it according to 389 the supplied criteria. The argument can be either a string or a SortKey 390 enum identifying the basis of a sort (example: ``'time'``, ``'name'``, 391 ``SortKey.TIME`` or ``SortKey.NAME``). The SortKey enums argument have 392 advantage over the string argument in that it is more robust and less 393 error prone. 394 395 When more than one key is provided, then additional keys are used as 396 secondary criteria when there is equality in all keys selected before 397 them. For example, ``sort_stats(SortKey.NAME, SortKey.FILE)`` will sort 398 all the entries according to their function name, and resolve all ties 399 (identical function names) by sorting by file name. 400 401 For the string argument, abbreviations can be used for any key names, as 402 long as the abbreviation is unambiguous. 403 404 The following are the valid string and SortKey: 405 406 +------------------+---------------------+----------------------+ 407 | Valid String Arg | Valid enum Arg | Meaning | 408 +==================+=====================+======================+ 409 | ``'calls'`` | SortKey.CALLS | call count | 410 +------------------+---------------------+----------------------+ 411 | ``'cumulative'`` | SortKey.CUMULATIVE | cumulative time | 412 +------------------+---------------------+----------------------+ 413 | ``'cumtime'`` | N/A | cumulative time | 414 +------------------+---------------------+----------------------+ 415 | ``'file'`` | N/A | file name | 416 +------------------+---------------------+----------------------+ 417 | ``'filename'`` | SortKey.FILENAME | file name | 418 +------------------+---------------------+----------------------+ 419 | ``'module'`` | N/A | file name | 420 +------------------+---------------------+----------------------+ 421 | ``'ncalls'`` | N/A | call count | 422 +------------------+---------------------+----------------------+ 423 | ``'pcalls'`` | SortKey.PCALLS | primitive call count | 424 +------------------+---------------------+----------------------+ 425 | ``'line'`` | SortKey.LINE | line number | 426 +------------------+---------------------+----------------------+ 427 | ``'name'`` | SortKey.NAME | function name | 428 +------------------+---------------------+----------------------+ 429 | ``'nfl'`` | SortKey.NFL | name/file/line | 430 +------------------+---------------------+----------------------+ 431 | ``'stdname'`` | SortKey.STDNAME | standard name | 432 +------------------+---------------------+----------------------+ 433 | ``'time'`` | SortKey.TIME | internal time | 434 +------------------+---------------------+----------------------+ 435 | ``'tottime'`` | N/A | internal time | 436 +------------------+---------------------+----------------------+ 437 438 Note that all sorts on statistics are in descending order (placing most 439 time consuming items first), where as name, file, and line number searches 440 are in ascending order (alphabetical). The subtle distinction between 441 ``SortKey.NFL`` and ``SortKey.STDNAME`` is that the standard name is a 442 sort of the name as printed, which means that the embedded line numbers 443 get compared in an odd way. For example, lines 3, 20, and 40 would (if 444 the file names were the same) appear in the string order 20, 3 and 40. 445 In contrast, ``SortKey.NFL`` does a numeric compare of the line numbers. 446 In fact, ``sort_stats(SortKey.NFL)`` is the same as 447 ``sort_stats(SortKey.NAME, SortKey.FILENAME, SortKey.LINE)``. 448 449 For backward-compatibility reasons, the numeric arguments ``-1``, ``0``, 450 ``1``, and ``2`` are permitted. They are interpreted as ``'stdname'``, 451 ``'calls'``, ``'time'``, and ``'cumulative'`` respectively. If this old 452 style format (numeric) is used, only one sort key (the numeric key) will 453 be used, and additional arguments will be silently ignored. 454 455 .. For compatibility with the old profiler. 456 457 .. versionadded:: 3.7 458 Added the SortKey enum. 459 460 .. method:: reverse_order() 461 462 This method for the :class:`Stats` class reverses the ordering of the 463 basic list within the object. Note that by default ascending vs 464 descending order is properly selected based on the sort key of choice. 465 466 .. This method is provided primarily for compatibility with the old 467 profiler. 468 469 470 .. method:: print_stats(*restrictions) 471 472 This method for the :class:`Stats` class prints out a report as described 473 in the :func:`profile.run` definition. 474 475 The order of the printing is based on the last 476 :meth:`~pstats.Stats.sort_stats` operation done on the object (subject to 477 caveats in :meth:`~pstats.Stats.add` and 478 :meth:`~pstats.Stats.strip_dirs`). 479 480 The arguments provided (if any) can be used to limit the list down to the 481 significant entries. Initially, the list is taken to be the complete set 482 of profiled functions. Each restriction is either an integer (to select a 483 count of lines), or a decimal fraction between 0.0 and 1.0 inclusive (to 484 select a percentage of lines), or a string that will interpreted as a 485 regular expression (to pattern match the standard name that is printed). 486 If several restrictions are provided, then they are applied sequentially. 487 For example:: 488 489 print_stats(.1, 'foo:') 490 491 would first limit the printing to first 10% of list, and then only print 492 functions that were part of filename :file:`.\*foo:`. In contrast, the 493 command:: 494 495 print_stats('foo:', .1) 496 497 would limit the list to all functions having file names :file:`.\*foo:`, 498 and then proceed to only print the first 10% of them. 499 500 501 .. method:: print_callers(*restrictions) 502 503 This method for the :class:`Stats` class prints a list of all functions 504 that called each function in the profiled database. The ordering is 505 identical to that provided by :meth:`~pstats.Stats.print_stats`, and the 506 definition of the restricting argument is also identical. Each caller is 507 reported on its own line. The format differs slightly depending on the 508 profiler that produced the stats: 509 510 * With :mod:`profile`, a number is shown in parentheses after each caller 511 to show how many times this specific call was made. For convenience, a 512 second non-parenthesized number repeats the cumulative time spent in the 513 function at the right. 514 515 * With :mod:`cProfile`, each caller is preceded by three numbers: the 516 number of times this specific call was made, and the total and 517 cumulative times spent in the current function while it was invoked by 518 this specific caller. 519 520 521 .. method:: print_callees(*restrictions) 522 523 This method for the :class:`Stats` class prints a list of all function 524 that were called by the indicated function. Aside from this reversal of 525 direction of calls (re: called vs was called by), the arguments and 526 ordering are identical to the :meth:`~pstats.Stats.print_callers` method. 527 528 529 .. method:: get_stats_profile() 530 531 This method returns an instance of StatsProfile, which contains a mapping 532 of function names to instances of FunctionProfile. Each FunctionProfile 533 instance holds information related to the function's profile such as how 534 long the function took to run, how many times it was called, etc... 535 536 .. versionadded:: 3.9 537 Added the following dataclasses: StatsProfile, FunctionProfile. 538 Added the following function: get_stats_profile. 539 540.. _deterministic-profiling: 541 542What Is Deterministic Profiling? 543================================ 544 545:dfn:`Deterministic profiling` is meant to reflect the fact that all *function 546call*, *function return*, and *exception* events are monitored, and precise 547timings are made for the intervals between these events (during which time the 548user's code is executing). In contrast, :dfn:`statistical profiling` (which is 549not done by this module) randomly samples the effective instruction pointer, and 550deduces where time is being spent. The latter technique traditionally involves 551less overhead (as the code does not need to be instrumented), but provides only 552relative indications of where time is being spent. 553 554In Python, since there is an interpreter active during execution, the presence 555of instrumented code is not required in order to do deterministic profiling. 556Python automatically provides a :dfn:`hook` (optional callback) for each event. 557In addition, the interpreted nature of Python tends to add so much overhead to 558execution, that deterministic profiling tends to only add small processing 559overhead in typical applications. The result is that deterministic profiling is 560not that expensive, yet provides extensive run time statistics about the 561execution of a Python program. 562 563Call count statistics can be used to identify bugs in code (surprising counts), 564and to identify possible inline-expansion points (high call counts). Internal 565time statistics can be used to identify "hot loops" that should be carefully 566optimized. Cumulative time statistics should be used to identify high level 567errors in the selection of algorithms. Note that the unusual handling of 568cumulative times in this profiler allows statistics for recursive 569implementations of algorithms to be directly compared to iterative 570implementations. 571 572 573.. _profile-limitations: 574 575Limitations 576=========== 577 578One limitation has to do with accuracy of timing information. There is a 579fundamental problem with deterministic profilers involving accuracy. The most 580obvious restriction is that the underlying "clock" is only ticking at a rate 581(typically) of about .001 seconds. Hence no measurements will be more accurate 582than the underlying clock. If enough measurements are taken, then the "error" 583will tend to average out. Unfortunately, removing this first error induces a 584second source of error. 585 586The second problem is that it "takes a while" from when an event is dispatched 587until the profiler's call to get the time actually *gets* the state of the 588clock. Similarly, there is a certain lag when exiting the profiler event 589handler from the time that the clock's value was obtained (and then squirreled 590away), until the user's code is once again executing. As a result, functions 591that are called many times, or call many functions, will typically accumulate 592this error. The error that accumulates in this fashion is typically less than 593the accuracy of the clock (less than one clock tick), but it *can* accumulate 594and become very significant. 595 596The problem is more important with :mod:`profile` than with the lower-overhead 597:mod:`cProfile`. For this reason, :mod:`profile` provides a means of 598calibrating itself for a given platform so that this error can be 599probabilistically (on the average) removed. After the profiler is calibrated, it 600will be more accurate (in a least square sense), but it will sometimes produce 601negative numbers (when call counts are exceptionally low, and the gods of 602probability work against you :-). ) Do *not* be alarmed by negative numbers in 603the profile. They should *only* appear if you have calibrated your profiler, 604and the results are actually better than without calibration. 605 606 607.. _profile-calibration: 608 609Calibration 610=========== 611 612The profiler of the :mod:`profile` module subtracts a constant from each event 613handling time to compensate for the overhead of calling the time function, and 614socking away the results. By default, the constant is 0. The following 615procedure can be used to obtain a better constant for a given platform (see 616:ref:`profile-limitations`). :: 617 618 import profile 619 pr = profile.Profile() 620 for i in range(5): 621 print(pr.calibrate(10000)) 622 623The method executes the number of Python calls given by the argument, directly 624and again under the profiler, measuring the time for both. It then computes the 625hidden overhead per profiler event, and returns that as a float. For example, 626on a 1.8Ghz Intel Core i5 running macOS, and using Python's time.process_time() as 627the timer, the magical number is about 4.04e-6. 628 629The object of this exercise is to get a fairly consistent result. If your 630computer is *very* fast, or your timer function has poor resolution, you might 631have to pass 100000, or even 1000000, to get consistent results. 632 633When you have a consistent answer, there are three ways you can use it:: 634 635 import profile 636 637 # 1. Apply computed bias to all Profile instances created hereafter. 638 profile.Profile.bias = your_computed_bias 639 640 # 2. Apply computed bias to a specific Profile instance. 641 pr = profile.Profile() 642 pr.bias = your_computed_bias 643 644 # 3. Specify computed bias in instance constructor. 645 pr = profile.Profile(bias=your_computed_bias) 646 647If you have a choice, you are better off choosing a smaller constant, and then 648your results will "less often" show up as negative in profile statistics. 649 650.. _profile-timers: 651 652Using a custom timer 653==================== 654 655If you want to change how current time is determined (for example, to force use 656of wall-clock time or elapsed process time), pass the timing function you want 657to the :class:`Profile` class constructor:: 658 659 pr = profile.Profile(your_time_func) 660 661The resulting profiler will then call ``your_time_func``. Depending on whether 662you are using :class:`profile.Profile` or :class:`cProfile.Profile`, 663``your_time_func``'s return value will be interpreted differently: 664 665:class:`profile.Profile` 666 ``your_time_func`` should return a single number, or a list of numbers whose 667 sum is the current time (like what :func:`os.times` returns). If the 668 function returns a single time number, or the list of returned numbers has 669 length 2, then you will get an especially fast version of the dispatch 670 routine. 671 672 Be warned that you should calibrate the profiler class for the timer function 673 that you choose (see :ref:`profile-calibration`). For most machines, a timer 674 that returns a lone integer value will provide the best results in terms of 675 low overhead during profiling. (:func:`os.times` is *pretty* bad, as it 676 returns a tuple of floating point values). If you want to substitute a 677 better timer in the cleanest fashion, derive a class and hardwire a 678 replacement dispatch method that best handles your timer call, along with the 679 appropriate calibration constant. 680 681:class:`cProfile.Profile` 682 ``your_time_func`` should return a single number. If it returns integers, 683 you can also invoke the class constructor with a second argument specifying 684 the real duration of one unit of time. For example, if 685 ``your_integer_time_func`` returns times measured in thousands of seconds, 686 you would construct the :class:`Profile` instance as follows:: 687 688 pr = cProfile.Profile(your_integer_time_func, 0.001) 689 690 As the :class:`cProfile.Profile` class cannot be calibrated, custom timer 691 functions should be used with care and should be as fast as possible. For 692 the best results with a custom timer, it might be necessary to hard-code it 693 in the C source of the internal :mod:`_lsprof` module. 694 695Python 3.3 adds several new functions in :mod:`time` that can be used to make 696precise measurements of process or wall-clock time. For example, see 697:func:`time.perf_counter`. 698