- 主题:time.sleep精度有问题 还是我测试方法有问题?
我需要核实一下 time.sleep的准确效果 用如下代码 。核实的结果,震惊!
想请教一下,是我的方法不对,还是 time.sleep 本来就是这么不堪?有没有三方库能精确一点的?谢谢
from time import perf_counter as pc
def slee_in_thread():
"""
测试一个极为短暂的sleep也实际上会导致15ms左右的暂停
以下为笔记本测试结果打印 win11 python.3.10
thread t:0.001 n:1000 time:15.547761800000444 avg:0.015547761800000445
以下为java平台运行类似代码的结果
java use time, t:1ms n:1000 total:1.516 avg:0.001516
"""
t = 1/1000
n = 1000
start = pc()
for i in range(n):
time.sleep(t)
span = pc() - start
print(f"thread t:{t} n:{n} time:{span} avg:{span/n}")
--
修改:misslost FROM 120.245.130.*
FROM 120.245.130.*
java或者其他很多平台能够用sleep实现大致的效果(误差没有这么夸张)。python中,类似的功能需求,应该用什么?
【 在 oldwatch 的大作中提到: 】
: sleep不是用来实现定时效果的
:
--
FROM 120.245.130.*
我自己更新一下
后来发现 python3.11对time.sleep做了大量改进。上面代码用3.11运行了一下 基本正常了。
python里面的坑真是有点多。
【 在 vwx 的大作中提到: 】
: 可能和操作系统有关
: Debian Linux 5.10.162-1下
: thread t:0.001 n:1000 time:1.1085763700102689 avg:0.001108576370010269
: ...................
--
FROM 120.245.130.*
不过还要补充提醒一下,即便在python3.11中 asyncio.sleep 还是非常不堪的
async def sleep_in_async(pc=time.perf_counter):
# 测试一个极为短暂的sleep也实际上会导致15ms左右的暂停
'''
笔记本测试结果
run in asyncio. t:0.001 n:1000 time:15.520545200000925 avg:0.015520545200000924
'''
n = 1000
t = 1/1000
start = pc()
for i in range(n):
await asyncio.sleep(t)
span = pc() - start
print(f"run in asyncio. t:{t} n:{n} time:{span} avg:{span/n}")
【 在 misslost 的大作中提到: 】
: 我需要核实一下 time.sleep的准确效果 用如下代码 。核实的结果,震惊!
: 想请教一下,是我的方法不对,还是 time.sleep 本来就是这么不堪?有没有三方库能精确一点的?谢谢
: from time import perf_counter as pc
: ...................
--
FROM 120.245.130.*
各位,仔细看一下我说的是什么主题好么
跟其他的开发语言的表现效果比较一下,就真的有那么不可接受吗
必须竖个自己喜欢的靶子来打么
【 在 ToSimplicity 的大作中提到: 】
: 这谈不上坑吧...
: 这是: 不看文档
: 难道它应该命名为time.sleep_n_plus_arbitrary_amount_because_of_the_scheduling_of_other_activity_in_the_system(secs)?
: ...................
--
FROM 120.245.130.*
确实跟操作系统是相关的。linux下的这块表现比较好 win下一直有问题
【 在 vwx 的大作中提到: 】
: 可能和操作系统有关
: Debian Linux 5.10.162-1下
: thread t:0.001 n:1000 time:1.1085763700102689 avg:0.001108576370010269
: ...................
--
FROM 120.245.130.*
真的跟python无关么,为什么java(还有其他的c、rust等等语言我就不需要测试了吧)他们都能sleep 1ms左右的时间,没有问题呢?第一个帖子我就发了对比数据的。
可以说这个确实符合文档的。不仅仅python的文档是这样写的,就是java的或者c的文档也是这么写的。文档是一样的,有的运行就正常一些,有的就拉跨一些。
难道python3.11在time.sleep上做了大量的改进。这些工作是没有必要没有价值吗?那些改进这些功能的人都是在浪费粮食吗
【 在 jimmycmh 的大作中提到: 】
: 这个事情跟python基本无关,都是操作系统决定的
: 首先,操作系统有个最低调度时间,有些操作系统可能是1ms,有些可能是10ms
: 其次,sleep只保证最少sleep这么久(其实也不能保证最少,有可能被SIGNAL提前唤醒),实际什么时候恢复取决于操作系统的调度
: ...................
--
FROM 120.245.130.*
有事说事。没事闭嘴。
【 在 lvsoft 的大作中提到: 】
: 丑人多作怪,菜鸟多震惊
: 换以前也许我会跟你耐心分析为什么,但现在我只想说这么多。
--
FROM 120.245.130.*
谢谢。
不过 此问题 python3.11中已经解决。此问题只在python3.10以及之前的版本运行在windows之上存在。另外 此问题在java等其他开发平台上也没有。
【 在 flw 的大作中提到: 】
:
: 对,真的无关。别折腾了。此路不通。
--
FROM 120.245.130.*