FreeBSD 上的 Python 时钟函数
-
12-09-2019 - |
题
在 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的,这反过来读取硬件时钟,其具有很好的分辨率。