سؤال

أثناء اختبار Pythons Time.Clock () وظيفة على FreeBSD لقد لاحظت ذلك دائما إرجاع نفس القيمة، حوالي 0.156

تعمل وظيفة الوقت. الوقت بشكل صحيح ولكني بحاجة إلى شيء بدقة أعلى قليلا.

هل يعمل أي شخص C هو ملزم وإذا كان هناك مؤقت بديل عالي الدقة؟

أنا لست ملوثا حتى الوحدة المهنية ليست مناسبة حقا هنا.

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

المحلول

Time.Clock () إرجاع وقت المعالج. وهذا هو، كم من الوقت استخدمت العملية الحالية على المعالج. لذلك إذا كان لديك برنامج نصي بيثون يسمى "clock.py"، وهذا يفعل import time;print time.clock() ستطبع بالفعل بالضبط في كل مرة تقوم فيها بتشغيله، حيث يتم تشغيل عملية جديدة في كل مرة.

فيما يلي سجل Console Python قد يفسره لك:

>>> import time
>>> time.clock()
0.11
>>> time.clock()
0.11
>>> time.clock()
0.11
>>> for x in xrange(100000000): pass
... 
>>> time.clock()
7.7800000000000002
>>> time.clock()
7.7800000000000002
>>> time.clock()
7.7800000000000002

آمل أن يوضح هذا الأشياء.

نصائح أخرى

ساعة بيثون. تدعو Call Call Clock (3) - man clock يجب أن تؤكد أنه من المفترض أن يعمل على BSD، لذلك لا أعرف لماذا لا يعمل من أجلك. ربما يمكنك محاولة العمل حول هذا الخطأ الظاهر في ميناء Python الخاص بك باستخدام ctypes لاستدعاء وظيفة الساعة من مكتبة النظام C مباشرة (إذا كنت قد قلت مكتبة كمكتبة .so / .dynlib / .dll أو أي مكتبات مشتركة ديناميكية يتم استدعاؤها على FreeBSD)؟

Time.time من المفترض أن يكون دقة عالية جدا، راجع للشغل، كما يسميه داخليا GetTimeOfday (حسنا، في بيثون مبني بشكل صحيح، على أي حال) - ما القرار الذي تلاحظه به على نظامك؟

يحرر: إليك wat.c, ، امتداد خاص ب BSD (تم اختباره على جهاز Mac الخاص بي فقط - آسف ولكن ليس لدي نكهة BSD الأخرى في متناول اليد اليمين تعرف) لحل المشكلة في مشكلة المنفذ FreeBSD الواضح:

#include "Python.h"
#include <sys/time.h>

static PyObject *
wat_time(PyObject *self, PyObject *args)
{
    struct timeval t;
    if (gettimeofday(&t, (struct timezone *)NULL) == 0) {
        double result = (double)t.tv_sec + t.tv_usec*0.000001;
        return PyFloat_FromDouble(result);
    }
    return PyErr_SetFromErrno(PyExc_OSError);
}

static PyMethodDef wat_methods[] = {
      {"time",      wat_time,       METH_VARARGS,
       PyDoc_STR("time() -> microseconds since epoch")},
      {NULL,        NULL}       /* sentinel */
};

PyDoc_STRVAR(wat_module_doc,
"Workaround for time.time issues on FreeBsd.");

PyMODINIT_FUNC
initwat(void)
{
    Py_InitModule3("wat", wat_methods, wat_module_doc);
}

وهنا هو setup.py لوضع في نفس الدليل:

from distutils.core import setup, Extension

setup (name = "wat",
       version = "0.1",
       maintainer = "Alex Martelli",
       maintainer_email = "aleaxit@gmail.com",
       url = "http://www.aleax.it/wat.zip",
       description = "WorkAround for Time in FreeBSD",
       ext_modules = [Extension('wat', sources=['wat.c'])],
)

عنوان URL صحيح، بحيث يمكنك أيضا الحصول على هذين الملفين مضغوط هنا.

لبناء وتثبيت هذا الامتداد، python setup.py install (إذا كان لديك إذن بالكتابة في تثبيت Python الخاص بك) أو python setup.py build_ext -i لكتابة Wat.So في الدليل الخاص الذي تضع فيه المصادر (ثم حركه يدويا أينما تفضل أن يكون لديك، ولكن أولا جربه python -c'import wat; print repr(wat.time())' في نفس الدليل الذي بنيت فيه).

واسمحوا لي أن أعرف كيف يعمل على FreeBSD (أو أي نكهة UNIX أخرى gettimeofday! -) - إذا كان مترجم C يشكو من gettimeofday, ، قد تكون على نظام لا يريد أن يرى حجتها الثانية، حاول دون ذلك! -).

time.clock() إرجاع وقت وحدة المعالجة المركزية على أنظمة UNIX، ووقت WallClock منذ بدء البرنامج على Windows. هذا إنات نداء مؤسف للغاية، في رأيي.

يمكنك العثور على التعريف ل time.time() في مصادر بيثون هنا (رابط إلى Google Code Search). يبدو أنه يستخدم الموقت الأعلى دقة المتاحة، والذي وفقا ل Googling سريعة gettimeofday() على FreeBSD أيضا، وينبغي أن يكون ذلك في فئة دقة ميكروكوند.

ومع ذلك، إذا كنت بحاجة حقا إلى مزيد من الدقة، فيمكنك النظر في كتابة وحدة نمطتك C الخاصة بك لتوقيت عالية الدقة حقا (شيء قد يؤدي فقط إلى إرجاع عدد microsecond الحالي، ربما!). Pyrex. يجعل بيثون تمديد الكتابة جهد جدا، و جرعة كبيرة هو الاختيار الشائع الآخر. (رغم أنه حقا، إذا كنت ترغب في حلاقة أكبر عدد ممكن من Microseconds من دقة الموقت الخاصة بك، فما عليك سوى كتابة ذلك كإرصاد بويث C Python بنفسك.) ctypes هو أيضا خيار، ولكن ربما بطيء إلى حد ما.

حظا سعيدا

يتم تنفيذ Time.Clock () لإرجاع قيمة مزدوجة ناتجة عن

 ((double)clock()) / CLOCKS_PER_SEC

لماذا تعتقد أن الوقت. الوقت () لديه دقة سيئة؟ يستخدم GetTimeOfday، والذي بدوره يقرأ ساعة الأجهزة، والذي له دقة جيدة للغاية.

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