在 FreeBSD 上测试 Python 的 time.clock() 函数时,我注意到它总是返回相同的值,大约 0.156

time.time() 函数工作正常,但我需要一个分辨率稍高的东西。

有人知道它所绑定的 C 函数吗?是否有替代的高分辨率计时器?

我不是在进行分析,因此 TimeIt 模块在这里并不合适。

有帮助吗?

解决方案

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

我希望这个澄清的事情。

其他提示

Python的time.clock调用C函数时钟(3) - man clock应该确认它应该在BSD上工作,所以我不知道为什么它不为你工作。也许你可以通过使用ctypes调用从系统的C库直接时钟功能(如果你所说的图书馆为/ .dynlib / .dll文件或动态共享库被称为的.so任何试图左右你的Python端口这种明显的错误工作在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'])],
)

在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 系统上返回 CPU 时间,在 Windows 上返回自程序启动以来的挂钟时间。在我看来,这是一种非常不幸的不对称。

您可以找到以下定义 time.time() 在 Python 源代码中 这里 (链接到 Google 代码搜索)。它似乎使用了可用的最高分辨率计时器,根据快速谷歌搜索是 gettimeofday() 在 FreeBSD 上也是如此,并且应该是微秒级的精度。

但是,如果您确实需要更高的精度,您可以考虑编写自己的 C 模块以获得真正的高分辨率计时(可能只返回当前微秒计数!)。 耐热玻璃 使 Python 扩展编写变得非常轻松,并且 斯威格 是另一个常见的选择。(不过,实际上,如果您想将计时器精度降低尽可能多的微秒,只需将其编写为纯 C Python 扩展即可。)Ctypes 也是一种选择,但可能相当慢。

祝你好运!

time.clock()被实现返回来自

所得的双精度值
 ((double)clock()) / CLOCKS_PER_SEC

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top