2009-07-30 60 views
45

我想記錄一些東西在真正的牆壁時間需要多長時間。目前,我這樣做:如何在python中獲得單調持續時間?

startTime = time.time() 
someSQLOrSomething() 
print "That took %.3f seconds" % (time.time() - startTime) 

但是,將失敗(產生不正確的結果),如果SQL查詢(或者不管它是什麼),運行時調整的時間。

我不想僅僅對它進行基準測試。我想將它登錄到實時應用程序中,以便查看現場系統的趨勢。

我想要的東西像clock_gettime(CLOCK_MONOTONIC,...),但在Python中。最好不用編寫一個調用clock_gettime()的C模塊。

+6

嗯,我真的不知道該怎麼通常它實際上是調整的。我運行NTP。但是使用單調時鐘,我不會遇到像Oracle RAC錯誤那樣在時間倒退時重新啓動系統的情況。除了小的NTP調整之外,還有可以前後移動的閏秒。 – Thomas 2009-07-30 12:41:31

+7

S.Lott:不正確。 「閏秒是正面或負面的一秒調整[...]」。查找起來微不足道。這是維基百科上「閏秒」文章的第一句話。所以當添加一個閏秒時,NTP會重新調整你的系統時間(因爲你的系統速度很快,不計數23:59:60),這意味着基於time.time()的測量可能是負面的。相信我,由於上面提到的上個年頭的錯誤,許多Oracle服務器都重新啓動。 我剛剛用Oracle作爲例子,其中一些程序無法處理時間重新調整。 – Thomas 2009-07-30 22:18:20

+0

我不知道爲什麼(未打補丁)Oracle 10會這樣做。它只是,Oracle(公司)證實了這一點。 – Thomas 2009-07-30 22:20:19

回答

71

這個函數是很簡單的,你可以使用ctypes的訪問它:

#!/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() 
8

正如this question指出,避免對Linux的NTP的調整需要CLOCK_MONOTONIC_RAW。這在Linux上定義爲4(自2.6.28開始)。

可移植地從Python中獲取正確的常量#define C頭是非常棘手的;有h2py,但這並不能真正幫助您在運行時獲得該值。

0

time.monotonic()可能是有用的:

返回的值(分數秒)的單調時鐘,即不能向後走的時鐘。時鐘不受系統時鐘更新的影響。返回值的參考點未定義,因此只有連續調用結果之間的差異才有效。

1

以下是我得到的Python 2.7單調時間:在Python

pip install monotonic 

然後:

安裝monotonic

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. 
相關問題