虽然测试蟒蛇time.clock()函数在FreeBSD,我注意到它总是返回相同的值,0.156左右
在选定了time.time()函数正常工作,但我需要一个东西有略微更高的分辨率。
有谁C函数它绑定到,如果有另一种高分辨率计时器?
我不这么剖析的timeit模块是不是真的适合这里。
虽然测试蟒蛇time.clock()函数在FreeBSD,我注意到它总是返回相同的值,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上工作,所以我不知道为什么它不为你工作。 也许你可以通过尝试围绕你的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
,你可能不希望看到它的第二个参数,尝试没有它的系统上! - )。
time.clock()
返回在UNIX系统上CPU时间和挂钟时间,因为在Windows启动程序。 这是一个非常不幸的insymmetry,在我看来。
你可以找到定义time.time()
在Python源这里 (链接到谷歌代码搜索)。 看来使用可用的最高分辨率计时器,根据谷歌搜索快是gettimeofday()
在FreeBSD为好,这应该是在微秒精度等级。
但是,如果你真的需要更准确,你可以看看你正在写C模块真正高分辨率定时(一些可能只是返回当前微秒计,也许吧!)。 耐热玻璃 ,使Python扩展写作非常费力,而且SWIG是另一个常见的选择。 (但实际上,如果你想刮胡子许多微秒关闭您的计时精度,只是把它写一个纯粹的C Python扩展自己。)ctypes的也是一种选择,但可能相当缓慢。
祝您好运!
time.clock()被实现以返回从得到的双值
((double)clock()) / CLOCKS_PER_SEC
为什么你认为了time.time()有坏的分辨率? 它采用gettimeofday的,这反过来读取硬件时钟,具有很好的分辨率。