How to measure time taken between lines of code in python?

前端 未结 7 869
伪装坚强ぢ
伪装坚强ぢ 2020-12-04 11:00

So in Java, we can do How to measure time taken by a function to execute

But how is it done in python? To measure the time start and end time between lines of codes?

相关标签:
7条回答
  • 2020-12-04 11:43

    If you want to measure CPU time, can use time.process_time() for Python 3.3 and above:

    import time
    start = time.process_time()
    # your code here    
    print(time.process_time() - start)
    

    First call turns the timer on, and second call tells you how many seconds have elapsed.

    There is also a function time.clock(), but it is deprecated since Python 3.3 and will be removed in Python 3.8.

    There are better profiling tools like timeit and profile, however time.process_time() will measure the CPU time and this is what you're are asking about.

    If you want to measure wall clock time instead, use time.time().

    0 讨论(0)
  • 2020-12-04 11:50

    Putting the code in a function, then using a decorator for timing is another option. (Source) The advantage of this method is that you define timer once and use it with a simple additional line for every function.

    First, define timer decorator:

    import functools
    import time
    
    def timer(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            start_time = time.perf_counter()
            value = func(*args, **kwargs)
            end_time = time.perf_counter()
            run_time = end_time - start_time
            print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3)))
            return value
    
        return wrapper
    

    Then, use the decorator while defining the function:

    @timer
    def doubled_and_add(num):
        res = sum([i*2 for i in range(num)])
        print("Result : {}".format(res))
    

    Let's try:

    doubled_and_add(100000)
    doubled_and_add(1000000)
    

    Output:

    Result : 9999900000
    Finished 'doubled_and_add' in 0.0119 secs
    Result : 999999000000
    Finished 'doubled_and_add' in 0.0897 secs
    

    Note: I'm not sure why to use time.perf_counter instead of time.time. Comments are welcome.

    0 讨论(0)
  • 2020-12-04 11:53

    You can also use time library:

    import time
    
    start = time.time()
    
    # your code
    
    # end
    
    print(f'Time: {time.time() - start}')
    
    0 讨论(0)
  • 2020-12-04 11:58

    You can try this as well:

    from time import perf_counter
    
    t0 = perf_counter()
    
    ...
    
    t1 = perf_counter()
    time_taken = t1 - t0
    
    0 讨论(0)
  • 2020-12-04 12:05

    With a help of a small convenience class, you can measure time spent in indented lines like this:

    with CodeTimer():
       line_to_measure()
       another_line()
       # etc...
    

    Which will show the following after the indented line(s) finishes executing:

    Code block took: x.xxx ms
    

    UPDATE: You can now get the class with pip install linetimer and then from linetimer import CodeTimer. See this GitHub project.

    The code for above class:

    import timeit
    
    class CodeTimer:
        def __init__(self, name=None):
            self.name = " '"  + name + "'" if name else ''
    
        def __enter__(self):
            self.start = timeit.default_timer()
    
        def __exit__(self, exc_type, exc_value, traceback):
            self.took = (timeit.default_timer() - self.start) * 1000.0
            print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')
    

    You could then name the code blocks you want to measure:

    with CodeTimer('loop 1'):
       for i in range(100000):
          pass
    
    with CodeTimer('loop 2'):
       for i in range(100000):
          pass
    
    Code block 'loop 1' took: 4.991 ms
    Code block 'loop 2' took: 3.666 ms
    

    And nest them:

    with CodeTimer('Outer'):
       for i in range(100000):
          pass
    
       with CodeTimer('Inner'):
          for i in range(100000):
             pass
    
       for i in range(100000):
          pass
    
    Code block 'Inner' took: 2.382 ms
    Code block 'Outer' took: 10.466 ms
    

    Regarding timeit.default_timer(), it uses the best timer based on OS and Python version, see this answer.

    0 讨论(0)
  • 2020-12-04 12:07

    I always prefer to check time in hours, minutes and seconds (%H:%M:%S) format:

    from datetime import datetime
    start = datetime.now()
    # your code
    end = datetime.now()
    time_taken = end - start
    print('Time: ',time_taken) 
    

    output:

    Time:  0:00:00.000019
    
    0 讨论(0)
提交回复
热议问题