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年溢出一次 - 如果您真的需要一个强大的解决方案,请更好地检查溢出...
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(),如本配方中所做的那样.
>>> 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)
| 归档时间: |
|
| 查看次数: |
74649 次 |
| 最近记录: |