문제

freebsd에서 pythons time.clock () 함수를 테스트하는 동안 항상 같은 값을 반환하는 것을 알았습니다. 약 0.156

time.time () 함수는 제대로 작동하지만 해상도가 약간 더 높은 것이 필요합니다.

대체 고해상도 타이머가있는 경우 C 기능이 있습니까?

프로파일 링이 아니므로 Timeit 모듈이 실제로 적절하지 않습니다.

도움이 되었습니까?

해결책

time.clock ()은 프로세서 시간을 반환합니다. 즉, 현재 프로세스가 프로세서에서 얼마나 많은 시간을 사용했는지. 따라서 "clock.py"라는 파이썬 스크립트가 있다면 import time;print time.clock() 새로운 프로세스가 매번 시작되므로 실제로 실행할 때마다 정확히 동일하게 인쇄됩니다.

다음은 귀하에게 설명 할 수있는 파이썬 콘솔 로그입니다.

>>> 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

나는 이것이 사물을 명확하게하기를 바랍니다.

다른 팁

Python 's Time.clock은 C 함수 클록 (3)을 호출합니다. man clock BSD에서 작동해야한다는 것을 확인해야하므로 왜 그것이 당신에게 효과가 없는지 모르겠습니다. 어쩌면 당신은 사용하여 파이썬 포트 에서이 명백한 버그를 해결하려고 시도 할 수 있습니다. ctypes System C 라이브러리에서 클럭 함수를 직접 호출하려면 (라이브러리를 .so/.dynlib/.dll이라고했거나 FreeBSD에서 동적 공유 라이브러리가 호출되는 경우)?

Time.Time은 내부적으로 GetTimeofday (어쨌든 적절하게 제대로 구축 된 Python에서)라고 부르기 때문에 BTW는 매우 높은 해상도로 여겨집니다. 시스템에서 어떤 해상도를 관찰합니까?

편집하다: 여기 있습니다 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이 정확 하므로이 두 파일을 ZIPTED를 얻을 수도 있습니다. 여기.

이 확장을 구축하고 설치하려면 python setup.py install (파이썬의 설치에 쓸 권한이있는 경우) 또는 python setup.py build_ext -i 소스를 넣는 디렉토리에 wat.을 작성하려면 (그리고 그것을 선호하는 곳이면 어디서나 수동으로 이동하지만 먼저 시도해보십시오. python -c'import wat; print repr(wat.time())' 당신이 그것을 구축 한 것과 동일한 디렉토리에서).

freebsd (또는 다른 유닉스 맛에서 어떻게 작동하는지 알려주세요. gettimeofday!-)-C 컴파일러가 불평하는 경우 gettimeofday, 당신은 두 번째 주장을보고 싶지 않은 시스템에있을 수 있습니다.

time.clock() UNIX 시스템에서 CPU 시간을 반환하고 WALLCLOCK 시간이 Windows에서 시작된 이후로 WallClock 시간을 반환합니다. 이것은 제 생각에 매우 불행한 무감각입니다.

정의를 찾을 수 있습니다 time.time() 파이썬 소스에서 여기 (Google 코드 검색 링크). 빠른 인터넷 검색에 따르면 가장 높은 해상도 타이머를 사용하는 것 같습니다. gettimeofday() FreeBSD에서도 마이크로 초 정확도 클래스에 있어야합니다.

그러나 실제로 더 정확성이 필요한 경우 실제로 고해상도 타이밍을 위해 자신의 C 모듈을 작성할 수 있습니다 (현재 마이크로 초 카운트를 반환 할 수있는 것). 파이렉스 Python Extension을 매우 쉽게 쓰는 것입니다 통음 다른 일반적인 선택입니다. (실제로, 타이머 정확도에서 많은 마이크로 초를 면도하고 싶다면 순수한 C Python 확장자 직접 작성하십시오.) CTYPES도 옵션이지만 아마도 느리게 글을 씁니다.

행운을 빌어 요!

time.clock ()은 이중 값을 반환하기 위해 구현됩니다.

 ((double)clock()) / CLOCKS_PER_SEC

시간 ()가 해상도가 나쁘다고 생각하는 이유는 무엇입니까? gettimeofday를 사용하여 해상도가 매우 우수한 하드웨어 시계를 읽습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top