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.. _deterministic-profiling: 529 530What Is Deterministic Profiling? 531================================ 532 533:dfn:`Deterministic profiling` is meant to reflect the fact that all *function 534call*, *function return*, and *exception* events are monitored, and precise 535timings are made for the intervals between these events (during which time the 536user's code is executing). In contrast, :dfn:`statistical profiling` (which is 537not done by this module) randomly samples the effective instruction pointer, and 538deduces where time is being spent. The latter technique traditionally involves 539less overhead (as the code does not need to be instrumented), but provides only 540relative indications of where time is being spent. 541 542In Python, since there is an interpreter active during execution, the presence 543of instrumented code is not required in order to do deterministic profiling. 544Python automatically provides a :dfn:`hook` (optional callback) for each event. 545In addition, the interpreted nature of Python tends to add so much overhead to 546execution, that deterministic profiling tends to only add small processing 547overhead in typical applications. The result is that deterministic profiling is 548not that expensive, yet provides extensive run time statistics about the 549execution of a Python program. 550 551Call count statistics can be used to identify bugs in code (surprising counts), 552and to identify possible inline-expansion points (high call counts). Internal 553time statistics can be used to identify "hot loops" that should be carefully 554optimized. Cumulative time statistics should be used to identify high level 555errors in the selection of algorithms. Note that the unusual handling of 556cumulative times in this profiler allows statistics for recursive 557implementations of algorithms to be directly compared to iterative 558implementations. 559 560 561.. _profile-limitations: 562 563Limitations 564=========== 565 566One limitation has to do with accuracy of timing information. There is a 567fundamental problem with deterministic profilers involving accuracy. The most 568obvious restriction is that the underlying "clock" is only ticking at a rate 569(typically) of about .001 seconds. Hence no measurements will be more accurate 570than the underlying clock. If enough measurements are taken, then the "error" 571will tend to average out. Unfortunately, removing this first error induces a 572second source of error. 573 574The second problem is that it "takes a while" from when an event is dispatched 575until the profiler's call to get the time actually *gets* the state of the 576clock. Similarly, there is a certain lag when exiting the profiler event 577handler from the time that the clock's value was obtained (and then squirreled 578away), until the user's code is once again executing. As a result, functions 579that are called many times, or call many functions, will typically accumulate 580this error. The error that accumulates in this fashion is typically less than 581the accuracy of the clock (less than one clock tick), but it *can* accumulate 582and become very significant. 583 584The problem is more important with :mod:`profile` than with the lower-overhead 585:mod:`cProfile`. For this reason, :mod:`profile` provides a means of 586calibrating itself for a given platform so that this error can be 587probabilistically (on the average) removed. After the profiler is calibrated, it 588will be more accurate (in a least square sense), but it will sometimes produce 589negative numbers (when call counts are exceptionally low, and the gods of 590probability work against you :-). ) Do *not* be alarmed by negative numbers in 591the profile. They should *only* appear if you have calibrated your profiler, 592and the results are actually better than without calibration. 593 594 595.. _profile-calibration: 596 597Calibration 598=========== 599 600The profiler of the :mod:`profile` module subtracts a constant from each event 601handling time to compensate for the overhead of calling the time function, and 602socking away the results. By default, the constant is 0. The following 603procedure can be used to obtain a better constant for a given platform (see 604:ref:`profile-limitations`). :: 605 606 import profile 607 pr = profile.Profile() 608 for i in range(5): 609 print(pr.calibrate(10000)) 610 611The method executes the number of Python calls given by the argument, directly 612and again under the profiler, measuring the time for both. It then computes the 613hidden overhead per profiler event, and returns that as a float. For example, 614on a 1.8Ghz Intel Core i5 running Mac OS X, and using Python's time.process_time() as 615the timer, the magical number is about 4.04e-6. 616 617The object of this exercise is to get a fairly consistent result. If your 618computer is *very* fast, or your timer function has poor resolution, you might 619have to pass 100000, or even 1000000, to get consistent results. 620 621When you have a consistent answer, there are three ways you can use it:: 622 623 import profile 624 625 # 1. Apply computed bias to all Profile instances created hereafter. 626 profile.Profile.bias = your_computed_bias 627 628 # 2. Apply computed bias to a specific Profile instance. 629 pr = profile.Profile() 630 pr.bias = your_computed_bias 631 632 # 3. Specify computed bias in instance constructor. 633 pr = profile.Profile(bias=your_computed_bias) 634 635If you have a choice, you are better off choosing a smaller constant, and then 636your results will "less often" show up as negative in profile statistics. 637 638.. _profile-timers: 639 640Using a custom timer 641==================== 642 643If you want to change how current time is determined (for example, to force use 644of wall-clock time or elapsed process time), pass the timing function you want 645to the :class:`Profile` class constructor:: 646 647 pr = profile.Profile(your_time_func) 648 649The resulting profiler will then call ``your_time_func``. Depending on whether 650you are using :class:`profile.Profile` or :class:`cProfile.Profile`, 651``your_time_func``'s return value will be interpreted differently: 652 653:class:`profile.Profile` 654 ``your_time_func`` should return a single number, or a list of numbers whose 655 sum is the current time (like what :func:`os.times` returns). If the 656 function returns a single time number, or the list of returned numbers has 657 length 2, then you will get an especially fast version of the dispatch 658 routine. 659 660 Be warned that you should calibrate the profiler class for the timer function 661 that you choose (see :ref:`profile-calibration`). For most machines, a timer 662 that returns a lone integer value will provide the best results in terms of 663 low overhead during profiling. (:func:`os.times` is *pretty* bad, as it 664 returns a tuple of floating point values). If you want to substitute a 665 better timer in the cleanest fashion, derive a class and hardwire a 666 replacement dispatch method that best handles your timer call, along with the 667 appropriate calibration constant. 668 669:class:`cProfile.Profile` 670 ``your_time_func`` should return a single number. If it returns integers, 671 you can also invoke the class constructor with a second argument specifying 672 the real duration of one unit of time. For example, if 673 ``your_integer_time_func`` returns times measured in thousands of seconds, 674 you would construct the :class:`Profile` instance as follows:: 675 676 pr = cProfile.Profile(your_integer_time_func, 0.001) 677 678 As the :class:`cProfile.Profile` class cannot be calibrated, custom timer 679 functions should be used with care and should be as fast as possible. For 680 the best results with a custom timer, it might be necessary to hard-code it 681 in the C source of the internal :mod:`_lsprof` module. 682 683Python 3.3 adds several new functions in :mod:`time` that can be used to make 684precise measurements of process or wall-clock time. For example, see 685:func:`time.perf_counter`. 686