Pergunta

Ao testar Pythons time.clock () em FreeBSD Tenho notado que sempre retorna o mesmo valor, em torno de 0,156

A função time.time () funciona corretamente, mas eu preciso de uma coisa com uma resolução ligeiramente mais elevado.

Alguém a função C é obrigado a e se há um temporizador de resolução alternativa de alta?

Eu não estou de perfil para que o módulo timeit não é realmente apropriado aqui.

Foi útil?

Solução

time.clock () retorna o tempo do processador. Ou seja, quanto tempo o processo atual tem usado no processador. Então se você tem um script Python chamado "clock.py", que faz import time;print time.clock() ele vai realmente imprimir sobre exatamente o mesmo cada vez que você executá-lo, como um novo processo é iniciado cada vez.

Aqui é um registro do console python que pode explicar isso para você:

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

Espero que isso esclarece as coisas.

Outras dicas

time.clock do Python chama relógio função C (3) - man clock deve confirmar que é suposto trabalhar em BSD, então eu não sei por que ele não está funcionando para você. Talvez você pode tentar trabalhar em torno deste aparente bug em sua porta Python usando ctypes para chamar a função de relógio a partir da biblioteca do sistema C diretamente (se você já disse biblioteca como um .so / .dynlib / .dll ou qualquer bibliotecas dinâmicas compartilhada são chamados no FreeBSD)?

time.time é suposto ser muito alta resolução, BTW, como internamente ele chama gettimeofday (bem, em um Python construído corretamente, de qualquer maneira?) - que resolução você observa por ele em seu sistema

Editar : wat.c está aqui, uma extensão específica do BSD (testado no meu Mac only - desculpe, mas eu não tenho outro sabor BSD na mão de know direita) Para contornar este problema port FreeBSD aparente:

#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);
}

E aqui está a setup.py para colocar no mesmo diretório:

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'])],
)

O URL está correto, então você também pode obter esses dois arquivos zipados aqui .

Para construir e instalar esta extensão, python setup.py install (se você tiver permissão para escrever na sua instalação do Python) ou python setup.py build_ext -i para escrever wat.so mesmo no diretório em que você colocou as fontes (e, em seguida, movê-lo manualmente sempre que você prefere tê-lo, mas primeiro experimentá-lo por exemplo, com python -c'import wat; print repr(wat.time())' no mesmo diretório em que você construiu-lo).

Por favor, deixe-me saber como ele funciona em FreeBSD (ou qualquer outro tipo de Unix com gettimeofday -!) - se o compilador C reclama gettimeofday, você pode estar em um sistema que não quer ver seu segundo argumento, tente sem ele -!).

tempo time.clock() retornos CPU em sistemas UNIX, e tempo wallclock desde o início do programa no Windows. Esta é uma insymmetry muito infeliz, na minha opinião.

Você pode encontrar a definição para time.time() nas fontes Python aqui (link para o Google Code Search). Ele parece usar a mais alta-resolução do temporizador disponível, o que de acordo com uma rápida Googling é gettimeofday() no FreeBSD, bem como, e que deve estar na classe de precisão microssegundo.

No entanto, se você realmente precisa de mais precisão, você pode olhar para escrever o seu próprio módulo C para realmente temporização de alta resolução (algo que só poderia retornar a contagem microssegundo atual, talvez!). Pyrex faz Python extensão escrita muito fácil, e SWIG é a outra opção comum. (Embora, na verdade, se você quiser fazer a barba como muitos microssegundos fora de sua precisão temporizador, basta escrevê-lo como um puro extensão C Python si mesmo.) Ctypes também é uma opção, mas provavelmente bastante lento.

Boa sorte!

time.clock () é implementada para retornar um valor duplo resultante

 ((double)clock()) / CLOCKS_PER_SEC

Por que você acha time.time () tem resolução ruim? Ele usa gettimeofday, que por sua vez lê o relógio de hardware, que tem resolução muito boa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top