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