How do I get time of a Python program's execution?

后端 未结 30 1667
甜味超标
甜味超标 2020-11-22 02:20

I have a command line program in Python that takes a while to finish. I want to know the exact time it takes to finish running.

I\'ve looked at the timeit

相关标签:
30条回答
  • 2020-11-22 02:47

    If you want to measure time in microseconds, then you can use the following version, based completely on the answers of Paul McGuire and Nicojo - it's Python 3 code. I've also added some colour to it:

    import atexit
    from time import time
    from datetime import timedelta, datetime
    
    
    def seconds_to_str(elapsed=None):
        if elapsed is None:
            return datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
        else:
            return str(timedelta(seconds=elapsed))
    
    
    def log(txt, elapsed=None):
        colour_cyan = '\033[36m'
        colour_reset = '\033[0;0;39m'
        colour_red = '\033[31m'
        print('\n ' + colour_cyan + '  [TIMING]> [' + seconds_to_str() + '] ----> ' + txt + '\n' + colour_reset)
        if elapsed:
            print("\n " + colour_red + " [TIMING]> Elapsed time ==> " + elapsed + "\n" + colour_reset)
    
    
    def end_log():
        end = time()
        elapsed = end-start
        log("End Program", seconds_to_str(elapsed))
    
    
    start = time()
    atexit.register(end_log)
    log("Start Program")
    

    log() => function that prints out the timing information.

    txt ==> first argument to log, and its string to mark timing.

    atexit ==> Python module to register functions that you can call when the program exits.

    0 讨论(0)
  • 2020-11-22 02:49

    I like the output the datetime module provides, where time delta objects show days, hours, minutes, etc. as necessary in a human-readable way.

    For example:

    from datetime import datetime
    start_time = datetime.now()
    # do your work here
    end_time = datetime.now()
    print('Duration: {}'.format(end_time - start_time))
    

    Sample output e.g.

    Duration: 0:00:08.309267
    

    or

    Duration: 1 day, 1:51:24.269711
    

    As J.F. Sebastian mentioned, this approach might encounter some tricky cases with local time, so it's safer to use:

    import time
    from datetime import timedelta
    start_time = time.monotonic()
    end_time = time.monotonic()
    print(timedelta(seconds=end_time - start_time))
    
    0 讨论(0)
  • 2020-11-22 02:49

    Use line_profiler.

    line_profiler will profile the time individual lines of code take to execute. The profiler is implemented in C via Cython in order to reduce the overhead of profiling.

    from line_profiler import LineProfiler
    import random
    
    def do_stuff(numbers):
        s = sum(numbers)
        l = [numbers[i]/43 for i in range(len(numbers))]
        m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
    
    numbers = [random.randint(1,100) for i in range(1000)]
    lp = LineProfiler()
    lp_wrapper = lp(do_stuff)
    lp_wrapper(numbers)
    lp.print_stats()
    

    The results will be:

    Timer unit: 1e-06 s
    
    Total time: 0.000649 s
    File: <ipython-input-2-2e060b054fea>
    Function: do_stuff at line 4
    
    Line #      Hits         Time  Per Hit   % Time  Line Contents
    ==============================================================
         4                                           def do_stuff(numbers):
         5         1           10     10.0      1.5      s = sum(numbers)
         6         1          186    186.0     28.7      l = [numbers[i]/43 for i in range(len(numbers))]
         7         1          453    453.0     69.8      m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
    
    0 讨论(0)
  • 2020-11-22 02:50

    The following snippet prints elapsed time in a nice human readable <HH:MM:SS> format.

    import time
    from datetime import timedelta
    
    start_time = time.time()
    
    #
    # Perform lots of computations.
    #
    
    elapsed_time_secs = time.time() - start_time
    
    msg = "Execution took: %s secs (Wall clock time)" % timedelta(seconds=round(elapsed_time_secs))
    
    print(msg)    
    
    0 讨论(0)
  • 2020-11-22 02:53

    In Linux or Unix:

    $ time python yourprogram.py
    

    In Windows, see this StackOverflow question: How do I measure execution time of a command on the Windows command line?

    For more verbose output,

    $ time -v python yourprogram.py
        Command being timed: "python3 yourprogram.py"
        User time (seconds): 0.08
        System time (seconds): 0.02
        Percent of CPU this job got: 98%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.10
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 9480
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 1114
        Voluntary context switches: 0
        Involuntary context switches: 22
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0
    
    0 讨论(0)
  • 2020-11-22 02:53

    For the data folks using Jupyter Notebook

    In a cell, you can use Jupyter's %%time magic command to measure the execution time:

    %%time
    [ x**2 for x in range(10000)]
    

    Output

    CPU times: user 4.54 ms, sys: 0 ns, total: 4.54 ms
    Wall time: 4.12 ms
    

    This will only capture the execution time of a particular cell. If you'd like to capture the execution time of the whole notebook (i.e. program), you can create a new notebook in the same directory and in the new notebook execute all cells:

    Suppose the notebook above is called example_notebook.ipynb. In a new notebook within the same directory:

    # Convert your notebook to a .py script:
    !jupyter nbconvert --to script example_notebook.ipynb
    
    # Run the example_notebook with -t flag for time
    %run -t example_notebook
    

    Output

    IPython CPU timings (estimated):
      User   :       0.00 s.
      System :       0.00 s.
    Wall time:       0.00 s.
    
    0 讨论(0)
提交回复
热议问题