FreeBSD上的Python时钟功能(Python clock function on FreeB

2019-10-16 21:32发布

虽然测试蟒蛇time.clock()函数在FreeBSD,我注意到它总是返回相同的值,0.156左右

在选定了time.time()函数正常工作,但我需要一个东西有略微更高的分辨率。

有谁C函数它绑定到,如果有另一种高分辨率计时器?

我不这么剖析的timeit模块是不是真的适合这里。

Answer 1:

time.clock()返回的处理器时间。 也就是说,有多少时间目前的进程在处理器上使用。 所以,如果你有一个名为“clock.py”一个Python脚本,这并import time;print time.clock()它确实将打印正是你运行它一样的,每次,作为一个新的进程每次启动。

这里是一个可能解释给你一个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

我希望这个澄清的事情。



Answer 2:

Python的time.clock调用C函数时钟(3) - man clock应该确认它应该在BSD上工作,所以我不知道为什么它不为你工作。 也许你可以通过尝试围绕你的Python端口这个明显的错误工作ctypes调用从系统的C库直接时钟功能(如果你所说的图书馆为/ .dynlib / .dll文件或动态共享库被称为什么的.so在FreeBSD上)?

了time.time应该是非常高的分辨率,顺便说一句,因为在内部调用gettimeofday的(当然,在一个适当的Python建,反正) - 你观察到它的系统上的哪些分辨率?

编辑 :这里的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'])],
)

网址是正确的,所以你也可以得到这两个文件压缩了这里 。

要建立和安装这个扩展, 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 ,你可能不希望看到它的第二个参数,尝试没有它的系统上! - )。



Answer 3:

time.clock()返回在UNIX系统上CPU时间和挂钟时间,因为在Windows启动程序。 这是一个非常不幸的insymmetry,在我看来。

你可以找到定义time.time()在Python源这里 (链接到谷歌代码搜索)。 看来使用可用的最高分辨率计时器,根据谷歌搜索快是gettimeofday()在FreeBSD为好,这应该是在微秒精度等级。

但是,如果你真的需要更准确,你可以看看你正在写C模块真正高分辨率定时(一些可能只是返回当前微秒计,也许吧!)。 耐热玻璃 ,使Python扩展写作非常费力,而且SWIG是另一个常见的选择。 (但实际上,如果你想刮胡子许多微秒关闭您的计时精度,只是把它写一个纯粹的C Python扩展自己。)ctypes的也是一种选择,但可能相当缓慢。

祝您好运!



Answer 4:

time.clock()被实现以返回从得到的双值

 ((double)clock()) / CLOCKS_PER_SEC

为什么你认为了time.time()有坏的分辨率? 它采用gettimeofday的,这反过来读取硬件时钟,具有很好的分辨率。



文章来源: Python clock function on FreeBSD