gpt4 book ai didi

python - 如何提高 python 中的 sleep /暂停计时精度?

转载 作者:太空狗 更新时间:2023-10-29 23:10:46 26 4
gpt4 key购买 nike

我进行了一个实验来比较 python 和 C++ 中的 sleep /暂停计时精度

实验总结:

在 1000000 次迭代的循环中,每次迭代休眠 1 微秒。

预期持续时间:1.000000 秒(对于 100% 准确的程序)

在 python 中:

import pause
import datetime

start = time.time()
dt = datetime.datetime.now()
for i in range(1000000):
dt += datetime.timedelta(microseconds=1)
pause.until(dt)
end = time.time()
print(end - start)

预期:1.000000 秒,实际(大约):2.603796

在 C++ 中:

#include <iostream>
#include <chrono>
#include <thread>

using namespace std;

using usec = std::chrono::microseconds;
using datetime = chrono::_V2::steady_clock::time_point;
using clk = chrono::_V2::steady_clock;

int main()
{
datetime dt;
usec timedelta = static_cast<usec>(1);

dt = clk::now();

const auto start = dt;

for(int i=0; i < 1000000; ++i) {
dt += timedelta;
this_thread::sleep_until(dt);
}

const auto end = clk::now();

chrono::duration<double> elapsed_seconds = end - start;

cout << elapsed_seconds.count();

return 0;
}

预期:1.000000 秒,实际(大约):1.000040

很明显C++更准确,但我正在用python开发一个项目,需要提高准确度。有什么想法吗?

P.S 如果您建议另一个 python 库/技术,只要它更准确就可以了:)

最佳答案

问题不仅仅是python的 sleep 定时器不准确,而是循环的每一部分都需要一些时间。

您的原始代码在我的系统上的运行时间为 ~1.9528656005859375。

如果我只在不休眠的情况下运行这部分代码:

for i in range(100000):
dt += datetime.timedelta(microseconds=1)

那么该循环所需的时间已经是 ~0.45999741554260254。

如果我只跑

for i in range(1000000):
pause.milliseconds(0)

那么代码的运行时间是~0.5583224296569824。

始终使用相同的日期:

dt = datetime.datetime.now()
for i in range(1000000):
pause.until(dt)

运行时间为 ~1.326077938079834

如果你对时间戳做同样的事情:

dt = datetime.datetime.now()
ts = dt.timestamp()
for i in range(1000000):
pause.until(ts)

然后运行时变为 ~0.36722803115844727

如果您将时间戳增加一微秒:

dt = datetime.datetime.now()
ts = dt.timestamp()
for i in range(1000000):
ts += 0.000001
pause.until(ts)

然后你得到一个~0.9536933898925781的运行时间

它小于 1 是由于 float 不准确,在循环后添加 print(ts-dt.timestamp()) 将显示 ~0.95367431640625,因此暂停持续时间本身是正确的,但是 ts += 0.000001 正在累积一个错误。

如果计算迭代次数并将 iterationCount/1000000 添加到开始时间,您将获得最佳结果:

dt = datetime.datetime.now()
ts = dt.timestamp()
for i in range(1000000):
pause.until(ts+i/1000000)

这将导致 ~1.000023365020752

所以在我的例子中,pause 本身已经允许小于 1 微秒的精度。问题实际上出在 datetime.timedeltasleep_until 都需要的 datetime 部分。

因此,如果您想获得微秒精度,那么您需要寻找一个性能优于 datetime 的时间库。

关于python - 如何提高 python 中的 sleep /暂停计时精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54981586/

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