How do I get monotonic time durations in python?

前端 未结 5 789
感情败类
感情败类 2020-11-27 03:09

I want to log how long something takes in real walltime. Currently I\'m doing this:

startTime = time.time()
someSQLOrSomething()
print \"That took %.3f secon         


        
相关标签:
5条回答
  • 2020-11-27 03:52

    As pointed out in this question, avoiding NTP readjustments on Linux requires CLOCK_MONOTONIC_RAW. That's defined as 4 on Linux (since 2.6.28).

    Portably getting the correct constant #defined in a C header from Python is tricky; there is h2py, but that doesn't really help you get the value at runtime.

    0 讨论(0)
  • 2020-11-27 03:59

    time.monotonic() might be useful:

    Return the value (in fractional seconds) of a monotonic clock, i.e. a clock that cannot go backwards. The clock is not affected by system clock updates. The reference point of the returned value is undefined, so that only the difference between the results of consecutive calls is valid.

    0 讨论(0)
  • 2020-11-27 04:03

    Now, in Python 3.3 you would use time.monotonic.

    0 讨论(0)
  • 2020-11-27 04:03

    Here's how I get monotonic time in Python 2.7:

    Install the monotonic package:

    pip install monotonic
    

    Then in Python:

    import monotonic; mtime = monotonic.time.time #now mtime() can be used in place of time.time()
    
    t0 = mtime()
    #...do something
    elapsed = mtime()-t0 #gives correct elapsed time, even if system clock changed.
    
    0 讨论(0)
  • 2020-11-27 04:05

    That function is simple enough that you can use ctypes to access it:

    #!/usr/bin/env python
    
    __all__ = ["monotonic_time"]
    
    import ctypes, os
    
    CLOCK_MONOTONIC_RAW = 4 # see <linux/time.h>
    
    class timespec(ctypes.Structure):
        _fields_ = [
            ('tv_sec', ctypes.c_long),
            ('tv_nsec', ctypes.c_long)
        ]
    
    librt = ctypes.CDLL('librt.so.1', use_errno=True)
    clock_gettime = librt.clock_gettime
    clock_gettime.argtypes = [ctypes.c_int, ctypes.POINTER(timespec)]
    
    def monotonic_time():
        t = timespec()
        if clock_gettime(CLOCK_MONOTONIC_RAW , ctypes.pointer(t)) != 0:
            errno_ = ctypes.get_errno()
            raise OSError(errno_, os.strerror(errno_))
        return t.tv_sec + t.tv_nsec * 1e-9
    
    if __name__ == "__main__":
        print monotonic_time()
    
    0 讨论(0)
提交回复
热议问题