web-dev-qa-db-ja.com

Pythonで単調な期間を取得するにはどうすればよいですか?

実際の実行時間に何かがかかった時間を記録したいと思います。現在私はこれをやっています:

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

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

ベンチマークだけを行いたくありません。ライブシステムの傾向を確認するために、ライブアプリケーションにログインしたいと思います。

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

53
Thomas

この関数は単純で、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 __== "__main__":
    print monotonic_time()
76
Armin Ronacher

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

35
Paddy3118

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

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

9
Daira Hopwood

Python 2.7で単調な時間を得る方法は次のとおりです:

monotonicパッケージをインストールします。

pip install monotonic

次に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.
3
Luke

time.monotonic()は役立つかもしれません:

単調な時計、つまり逆戻りできない時計の値(小数秒単位)を返します。クロックは、システムクロックの更新の影響を受けません。戻り値の参照点は定義されていないため、連続した呼び出しの結果の違いのみが有効です。

1
AmirHossein