测量python中的已用时间

Med*_*o42 49 python windows time duration

是否有一个简单的方法/模块来正确测量python中的已用时间?我知道我可以简单地调用time.time()两次并消除差异,但如果系统时间改变,那将产生错误的结果.当然,这不会经常发生,但它确实表明我在测量错误的东西.

使用time.time()测量持续时间,当你想想这是令人难以置信的回旋.您可以通过持续时间测量(由计时器执行)和已知绝对时间(手动设置或通过ntp设置)构建两个绝对时间测量值的差值,您根本不感兴趣.

那么,有没有办法直接查询这个"计时器时间"?我想它可以表示为没有有意义的绝对表示的毫秒或微秒值(因此不需要用系统时间进行调整).看一下似乎这正是System.nanoTime()Java中的内容,但我没有找到相应的Python函数,即使它应该(硬件技术上)比提供更容易time.time().

编辑:为了避免混淆并解决以下答案:这不是关于DST更改,我也不想要CPU时间 - 我想要经过的物理时间.它不需要非常细粒度,甚至不是特别准确.它只是因为有人决定将系统时钟设置为不同的值,所以不应该给我负的持续时间或者持续时间偏离几个数量级(高于粒度).以下是Python文档关于'time.time()'的内容:

"虽然此函数通常返回非递减值,但如果在两次调用之间设置了系统时钟,则它可以返回比先前调用更低的值"

这正是我想要避免的,因为它可能导致奇怪的事情,如时间计算中的负值.我现在可以解决这个问题,但我相信在可行的情况下学习使用适当的解决方案是一个好主意,因为有一天克拉奇会回来咬你.

编辑2:一些研究表明,你可以通过使用GetTickCount64()在Windows中获得我想要的系统时间独立测量,在Linux下你可以在times()的返回值中得到它.但是,我仍然找不到在Python中提供此功能的模块.

daw*_*awg 24

要测量经过的CPU时间,请查看time.clock().这相当于Linux的times()用户时间字段.

对于基准测试,请使用timeit.

日期时间模块,这是Python的2.3+的一部分,也有如果平台支持微秒的时间.

例:

>>> import datetime as dt
>>> n1=dt.datetime.now()
>>> n2=dt.datetime.now()
>>> (n2-n1).microseconds
678521
>>> (n2.microsecond-n1.microsecond)/1e6
0.678521
ie, it took me .678521 seconds to type the second n2= line -- slow
>>> n1.resolution
datetime.timedelta(0, 0, 1)
1/1e6 resolution is claimed.
Run Code Online (Sandbox Code Playgroud)

如果您担心系统时间更改(从DS - > ST),只需检查datetime返回的对象.可能,系统时间可以从NTP参考调整中进行小幅调整.这应该是回转的,并且逐渐应用校正,但是ntp sync beats可以对非常小(毫秒或微秒)的时间参考产生影响.

如果你想要那种分辨率,你也可以参考Alex Martelli的C函数.我不会走得太远,不能重新发明轮子.准确的时间是基本的,大多数现代操作系统都做得很好.

编辑

根据您的说明,如果系统的时钟发生变化,您需要进行简单的侧面检查.只需与友好的本地ntp服务器进行比较:

import socket
import struct
import time

ntp="pool.ntp.org"   # or whatever ntp server you have handy

client = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
data = '\x1b' + 47 * '\0'
client.sendto( data, ( ntp, 123 ))
data, address = client.recvfrom( 1024 )
if data:
    print 'Response received from:', address
    t = struct.unpack( '!12I', data )[10]
    t -= 2208988800L #seconds since Epoch
    print '\tTime=%s' % time.ctime(t)
Run Code Online (Sandbox Code Playgroud)

NTP在因特网上精确到毫秒,并具有2-32秒(233皮秒)的分辨率表示分辨率.应该够好吗?

请注意,NTP 64位数据结构将在2036年以及此后每136年溢出一次 - 如果您真的需要一个强大的解决方案,请更好地检查溢出...

  • 请注意,该示例在说明".678521秒输入第二个n2 =行"时会产生误导.'microseconds'方法仅返回时差的微秒部分.调用'秒'返回秒的部分时间.总时间实际上是(n2-n1).秒+(n2-n1).微秒/ 1e6.或者,可以调用(n2-n1).total_seconds()来组合两个部分. (3认同)
  • 我不认为NTP服务器查询是一个优雅的解决方案.毕竟,有专门的硬件用于测量我想要构建到基本上每台PC的内容,并且可以通过Windows和Linux上的系统功能进行查询 - 请参阅上面的新编辑. (2认同)

Med*_*o42 11

Python 3.3 在标准库中添加了一个单调计时器,它完全符合我的要求.感谢Paddy3118在"如何在python中获得单调持续时间?"中指出这一点..


the*_*olf 10

你似乎在寻找的是一个单调的计时器.一个单调的时间参考不跳或倒退.

已经有多次尝试基于OS的OS引用为Python实现跨平台单调时钟.(Windows,POSIX和BSD完全不同)请参阅此SO帖子中的讨论和单调时间的一些尝试.

大多数情况下,你可以使用os.times():

os.times()

返回一个5元组的浮点数,表示累计(处理器或其他)时间,以秒为单位.该项目是:用户时间,系统时间,儿童用户的时间,孩子们的系统时间,并经过实时因为在过去的一个固定点,按照这个顺序.请参阅Unix手册页时间(2)或相应的Windows Platform API文档.在Windows上,只填充前两个项目,其他项目为零.

可用性:Unix,Windows

但这并没有填补Windows上所需的实时(第五元组).

如果您需要Windows支持,请考虑ctypes并直接调用GetTickCount64(),如本配方中所做的那样.


Mar*_*som 5

>>> import datetime
>>> t1=datetime.datetime.utcnow()
>>> t2=datetime.datetime.utcnow()
>>> t2-t1
datetime.timedelta(0, 8, 600000)
Run Code Online (Sandbox Code Playgroud)

使用UTC可以避免由于夏令时而导致时钟移动的那些令人尴尬的时期.

至于使用替代方法而不是减去两个时钟,请注意操作系统实际上包含一个从PC中的硬件时钟初始化的时钟.现代OS实现还将使该时钟与某些官方源同步,以使其不会漂移.这比PC可能正在运行的任何间隔计时器准确得多.


小智 2

您可以使用perf_counterPython标准库中的time模块函数:

from datetime import timedelta
from time import perf_counter

startTime = perf_counter()
CallYourFunc()
finishedTime = perf_counter()
duration = timedelta(seconds=(finishedTime - startTime))
Run Code Online (Sandbox Code Playgroud)