是否有一个简单的方法/模块来正确测量python中的已用时间?我知道我可以简单地调用time.time()两次并消除差异,但如果系统时间改变,那将产生错误的结果.当然,这不会经常发生,但它确实表明我在测量错误的东西.
使用time.time()测量持续时间,当你想想这是令人难以置信的回旋.您可以通过持续时间测量(由计时器执行)和已知绝对时间(手动设置或通过ntp设置)构建两个绝对时间测量值的差值,您根本不感兴趣.
那么,有没有办法直接查询这个"计时器时间"?我想它可以表示为没有有意义的绝对表示的毫秒或微秒值(因此不需要用系统时间进行调整).看一下似乎这正是System.nanoTime()Java中的内容,但我没有找到相应的Python函数,即使它应该(硬件技术上)比提供更容易time.time().
编辑:为了避免混淆并解决以下答案:这不是关于DST更改,我也不想要CPU时间 - 我想要经过的物理时间.它不需要非常细粒度,甚至不是特别准确.它只是因为有人决定将系统时钟设置为不同的值,所以不应该给我负的持续时间或者持续时间偏离几个数量级(高于粒度).以下是Python文档关于'time.time()'的内容:
"虽然此函数通常返回非递减值,但如果在两次调用之间设置了系统时钟,则它可以返回比先前调用更低的值"
这正是我想要避免的,因为它可能导致奇怪的事情,如时间计算中的负值.我现在可以解决这个问题,但我相信在可行的情况下学习使用适当的解决方案是一个好主意,因为有一天克拉奇会回来咬你.
编辑2:一些研究表明,你可以通过使用GetTickCount64()在Windows中获得我想要的系统时间独立测量,在Linux下你可以在times()的返回值中得到它.但是,我仍然找不到在Python中提供此功能的模块.
我正在尝试将GPU与CPU性能进行比较.对于NVIDIA GPU,我一直在使用这些cudaEvent_t类型来获得非常精确的时序.
对于CPU我一直在使用以下代码:
// Timers
clock_t start, stop;
float elapsedTime = 0;
// Capture the start time
start = clock();
// Do something here
.......
// Capture the stop time
stop = clock();
// Retrieve time elapsed in milliseconds
elapsedTime = (float)(stop - start) / (float)CLOCKS_PER_SEC * 1000.0f;
Run Code Online (Sandbox Code Playgroud)
显然,如果你在几秒钟内计算,那段代码就是好的.此外,结果有时候出来很奇怪.
有谁知道在Linux中创建高分辨率计时器的某种方法?
我正在寻找GetTickCount()与Linux 相当的东西.
目前我正在使用Python time.time(),可能是通过调用gettimeofday().我担心的是,如果时钟被弄乱,例如NTP,返回的时间(unix时期)可能会不规律地改变.一个简单的过程或系统壁挂时间,只能以恒定的速率正向增加就足够了.
是否存在C或Python中的任何此类时间函数?
伙计们,在我的应用程序中,我正在使用clock_gettime(CLOCK_MONOTONIC)它来测量帧之间的增量时间(gamedev中的典型方法),并且我不时会遇到奇怪的行为clock_gettime(..)- 返回的值偶尔也不是单调的(即上一次.是更大的比目前的时间).
目前,如果发生这样的悖论,我只需跳过当前帧并开始处理下一帧.
问题是这怎么可能呢?这是Linux POSIX实现中的一个错误clock_gettime吗?我使用的是Ubuntu Server Edition 10.04(内核2.6.32-24,x86_64),gcc-4.4.3.
基本上,我希望能够输出运行应用程序的已用时间.我想我需要使用某种timeit函数,但我不确定是哪一个.我正在寻找类似以下的东西......
START MY TIMER
code for application
more code
more code
etc
STOP MY TIMER
Run Code Online (Sandbox Code Playgroud)
OUTPUT ELAPSED TIME在计时器的启动和停止之间执行上述代码.思考?
检查当前运行的Celery任务会发现一个奇怪的time_start时间戳:
>> celery.app.control.inspect().active()
{u'celery@worker.hostname': [{u'acknowledged': True,
u'args': u'(...,)',
u'delivery_info': {u'exchange': u'celery',
u'priority': 0,
u'redelivered': None,
u'routing_key': u'celery'},
u'hostname': u'celery@worker.hostname',
u'id': u'3d92fdfd-524e-4ba1-98cb-cf83af2ad8e9',
u'kwargs': u'{}',
u'name': u'task_name',
u'time_start': 9636801.218162088,
u'worker_pid': 7931}]}
Run Code Online (Sandbox Code Playgroud)
该time_start属性将任务追溯到1970年(那是在创建Celery,Python之前,我没有自定义的DeLorean):
>> from datetime import datetime
>> datetime.fromtimestamp(9636801.218162088)
datetime.datetime(1970, 4, 22, 13, 53, 21, 218162)
Run Code Online (Sandbox Code Playgroud)
我是否误解了这个time_task属性?我的Celery应用程序配置错误了吗?
我在Linux上使用带有Django应用程序和Redis后端的Celery 3.1.4.
任务由执行的工作程序运行,如下所示:
./manage.py celery worker --loglevel=INFO --soft-time-limit=600 --logfile=/tmp/w1.log --pidfile=/tmp/w1.pid -n 'w1.%%h'
Run Code Online (Sandbox Code Playgroud) 我终于弄明白这一点,想分享知识并节省一些时间,所以请看下面的答案.但是,我仍然需要Linux的答案,所以如果你知道,请回答,因为我的答案中的代码仅适用于Windows.
更新:我也想到了Linux,包括前Python 3.3(例如:Raspberry Pi),我在下面的答案中发布了我的新模块/代码.
我原来的问题:如何在Python中获得毫秒和微秒分辨率的时间戳?我也喜欢类似Arduino的延迟和delayMicroseconds()函数.
几个月前,这个问题被标记为这个问题的副本.看这里:
它说,"这个问题在这里已有答案." 不幸的是,这不是真的.几年前我在问这个问题之前就读过这些答案了,他们没有回答我的问题,也没有满足我的需要.它们和我的问题一样不适用,因为它是最黑的回答,因为它依赖于time模块,因为它依赖于模块,因为它不具有任何类型的保证分辨率,因此它是不可思议的错误:
请重新打开我的问题.它不是重复的.它没有其他问题的事先答案.链接已经包含答案的问题依赖于time模块,甚至表明它的解决方案已经到处都是.最热门的答案是使用16毫秒的答案引用Windows分辨率,这比我在此提供的答案(0.5 美分分辨率)差32000倍.同样,我需要1 ms和1 us(或类似)分辨率,而不是16000 us分辨率.因此,它不是重复的.
谢谢你的时间.:)
有没有办法在python中获得高精度的系统时间?
我有一个小应用程序来使用虚拟COM端口.我想测量发送消息和接收消息之间的时间间隔.
目前它的工作原理如下:
我获取消息,使用
time.time()
Run Code Online (Sandbox Code Playgroud)
并将其20位数附加到邮件中.客户端应用程序收到此消息并获取
time.time()
Run Code Online (Sandbox Code Playgroud)
再次,然后计算他们的差异.在大多数情况下,时间间隔(如我所料)等于零.
问题是:有没有办法以更智能的方式更精确地做到这一点?