كيف يمكنني الحصول على المدد الزمنية رتيب في بيثون؟

StackOverflow https://stackoverflow.com/questions/1205722

سؤال

وأريد أن تسجيل متى ما يأخذ في walltime الحقيقي. حاليا أنا أفعل هذا:

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

ولكن من شأنها أن تفشل (تعطي نتائج غير صحيحة) إذا تم ضبط الوقت في حين الاستعلام SQL (أو أيا كانت) قيد التشغيل.

وأنا لا أريد أن مجرد مؤشر عليه. أريد أن تسجيل في تطبيق يعيش من أجل أن نرى الاتجاهات على نظام العيش.

وأريد شيء من هذا القبيل clock_gettime (CLOCK_MONOTONIC، ...)، ولكن في بيثون. ويفضل أن يكون ذلك دون الحاجة إلى إرسال وحدة نمطية C التي تدعو clock_gettime ().

هل كانت مفيدة؟

المحلول

وهذا وظيفة بسيطة بما فيه الكفاية التي يمكنك استخدامها 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()

نصائح أخرى

والآن، في بيثون 3.3 ستستخدم time.monotonic .

وكما أشار في هذا السؤال ، وتجنب NTP تعديلات على لينكس يتطلب CLOCK_MONOTONIC_RAW. وهذا ما يعرف بأنه 4 على لينكس (منذ 2.6.28).

والحصول على تنقليا ثابت الصحيح #defined في رأس C من بيثون هو صعب. هناك h2py، ولكن هذا لا تساعد حقا على الحصول على قيمة في وقت التشغيل.

وهنا هو كيف يمكنني الحصول على وقت رتيب في بيثون 2.7:

وتثبيت حزمة monotonic:

pip install 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.

وربما يكون من المفيد time.monotonic():

<اقتباس فقرة>   

وإرجاع قيمة (بالثواني كسور) من ساعة رتيب، أي على مدار الساعة لا يمكن أن نعود إلى الوراء. لا يتأثر على مدار الساعة بواسطة التحديثات ساعة النظام. النقطة المرجعية من القيمة التي تم إرجاعها غير محددة، بحيث لا فرق بين نتائج دعوات متتالية صالح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top