58

実際のウォールタイムで何かにかかる時間を記録したいと思います。現在、私はこれをやっています:

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

ただし、SQL クエリ (またはそれが何であれ) の実行中に時間が調整されると、失敗します (誤った結果が生成されます)。

私はそれをベンチマークしたくありません。ライブ システムの傾向を確認するために、ライブ アプリケーションにログを記録したいと考えています。

私は clock_gettime(CLOCK_MONOTONIC,...) のようなものが欲しいのですが、Python で。そしてできれば、clock_gettime() を呼び出す C モジュールを作成する必要はありません。

4

5 に答える 5

83

この関数は、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()
于 2009-07-30T10:33:40.613 に答える
45

ここで、Python 3.3では、time.monotonicを使用します。

于 2013-01-19T16:49:11.957 に答える
9

この質問で指摘されているように、Linux で NTP の再調整を回避するには、CLOCK_MONOTONIC_RAW が必要です。Linux では 4 と定義されています (2.6.28 以降)。

Python から C ヘッダーで定義された正しい定数 #defined を移植可能に取得するのは注意が必要です。h2py がありますが、実行時に値を取得するのにはあまり役立ちません。

于 2010-12-20T01:03:00.737 に答える