gpt4 book ai didi

python - 在python中测量耗时

转载 作者:IT老高 更新时间:2023-10-28 20:32:09 35 4
gpt4 key购买 nike

有没有一种简单的方法/模块可以正确测量python中的耗时?我知道我可以简单地调用 time.time() 两次并获取差异,但是如果系统时间更改,则会产生错误的结果。诚然,这种情况并不经常发生,但它确实表明我衡量的是错误的东西。

使用 time.time() 来测量持续时间是令人难以置信的迂回考虑。您获取两个绝对时间测量值的差异,这两个绝对时间测量值依次由持续时间测量(由计时器执行)和已知绝对时间(手动或通过 ntp 设置)构成,您根本不感兴趣。

那么,有没有办法直接查询这个“定时器时间”呢?我想它可以表示为没有有意义的绝对表示的毫秒或微秒值(因此不需要随系统时间进行调整)。环顾四周,这似乎正是 System.nanoTime() 在 Java 中所做的,但我没有找到相应的 Python 函数,尽管它应该(硬件技术上)更容易提供比 time.time().

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

"While this function normally returns non-decreasing values, it can return a lower value than a previous call if the system clock has been set back between the two calls"

这正是我想要避免的,因为它会导致奇怪的事情,比如时间计算中的负值。我现在可以解决这个问题,但我相信在可行的情况下学习使用正确的解决方案是个好主意,因为有一天这些杂物会卷土重来。

Edit2:一些研究表明,您可以像我在 Windows 中使用 GetTickCount64() 一样获得与系统时间无关的测量值,在 Linux 下,您可以在 times() 的返回值中获得它。但是,我仍然找不到在 Python 中提供此功能的模块。

最佳答案

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

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

datetime module , which is part of 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.

如果您担心系统时间更改(从 DS -> ST),只需检查 datetime 返回的对象。推测系统时间可能会从 NTP 进行小幅调整引用调整。 This should be slewed , 更正为 applied gradually ,但 ntp 同步节拍可以对非常小的(毫秒或微秒)时间引用产生影响。

您也可以引用Alex Martelli's C function如果你想要那个分辨率的东西。我不会走得太远去重新发明轮子。准确的时间是基本的,大多数现代操作系统都做得很好。

编辑

根据您的说明,听起来您需要简单检查一下系统时钟是否已更改。只需与友好的本地 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)

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

注意 NTP 64 位数据结构 will overflow in 2036 and every 136 years thereafter -- 如果你真的想要一个强大的解决方案,最好检查溢出...

关于python - 在python中测量耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7421641/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com