在我的程式中,我有一個無休止的 while 回圈,它需要以固定的頻率運行以提供恒定的資料速率。我的想法(我從 github 復制的)是在回圈外和回圈內獲取時間戳,并使用增量作為我的頻率。
import time
time_after_loop = time.process_time() # initalisation
frequency = 0.05
while True:
time_before_loop = time.process_time()
if time_before_loop - time_after_loop >= frequency:
real_frequency = time_before_loop - time_after_loop
print(real_frequency)
# main programm
time_after_loop = time.process_time()
我使用 Windows 10 和 python 3.8,列印值顯示了一些有趣的行為
頻率 = 0.5 --> real_frequency = 0.5
頻率 = 0.1 --> real_frequency = 0.109375
頻率 = 0.05 --> real_frequency = 0.0625
頻率 = 0.001 --> real_frequency = 0.015625 --> 最大頻率
它看起來像一個系統錯誤,而不是代碼中的問題?有人知道這里發生了什么以及如何解決嗎?
uj5u.com熱心網友回復:
使用time.perf_counter()代替time.process_time(),因為它包括睡眠期間經過的時間并且是系統范圍的。
回傳性能計數器的值(以秒為單位),即具有最高可用解析度的時鐘以測量短持續時間。它確實包括睡眠期間經過的時間,并且是系統范圍的。
輸出:
0.05000000004656613
0.05000000004656613
0.05000010004732758
0.050000099930912256
0.050000099930912256
0.05001329991500825
0.05000010004732758
0.050000099930912256
0.050000099930912256
0.05000000004656613
0.050000099930912256
0.05000010004732758
uj5u.com熱心網友回復:
它看起來像一個系統錯誤,而不是代碼中的問題?
我不確定這是否是這種情況,但請注意這print不是免費的時間(它需要很短但不是零時間print)
有人知道這里發生了什么以及如何解決嗎?
我建議查看threading,Timer可能用于每 x 秒開始執行操作,無論所述操作花費多少時間,請考慮以下簡單示例,該示例每秒無休止地列印 2 次(即每 0.5 秒)
import threading
def func():
threading.Timer(0.5, func).start()
print("Hello")
func()
請注意,func在采取適當行動之前,下一次執行被推入佇列。
uj5u.com熱心網友回復:
對于 Linux 和 Mac, Pythontime僅精確到 - 0.001 毫秒,對于 Windows 則精確到 - 0.016。變得非常準確是很難的。在這里閱讀更多
uj5u.com熱心網友回復:
嘗試使用 ( time.time()) 代替,time.process_time()看看它是否會給您更準確的結果。
import time
time_after_loop = time.time() # initialization
frequency = 0.1
while True:
time_before_loop = time.time()
if time_before_loop - time_after_loop >= frequency:
real_frequency = time_before_loop - time_after_loop
print(real_frequency)
# main programm
time_after_loop = time.time()
uj5u.com熱心網友回復:
非常感謝你!!你幫了我很多
時間.時間()
和
time.perf_counter()
運作良好
time.process_time() 是在這里使用的錯誤函式!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462017.html
上一篇:如何以更簡單的方式撰寫此內容?
下一篇:如何將此回圈轉換為串列理解?
