
time(), time_ns()
time() 以 float 形式返回自紀元以來的時間(以秒為單位)。 閏秒的處理取決於平台。 在 Windows 和大多數 Unix 系統上,閏秒不計入自紀元以來的秒數中。 這通常稱為 Unix 時間。
time_ns() 與 time() 類似,但以奈秒 (nanoseconds) 為單位。可以避免 float 帶來的精準度損失。
import time
current_time = time.time()
print('The current time is', current_time) # Output: 1688807663.873429
start_time = time.time()
time.sleep(1)
end_time = time.time()
print(f"{end_time - start_time:.4f} s") # Output: 1.0123 smonotonic(), monotonic_ns()
monotonic() 返回單調遞增時鐘 (Monotonic Clock),以秒為單位。 時鐘不受系統時鐘更新的影響。 返回值的參考點未定義,因此只有兩次調用結果之間的差異才有效。
這使得它在您想要測量經過時間而不必擔心由於閏秒、DST (Daylight Saving Time)或系統時鐘的其他更改,而導致的時間變化的情況下非常有用。
monotonic_ns() 與 monotonic() 類似,但以奈秒 (nanoseconds) 為單位。可以避免 float 帶來的精準度損失。
範例 – 速率限制器
速率限制器 (RateLimiter) 是一種工具,用於監視實體 (例如:使用者或 IP address) 在一定時間內 (例如:一分鐘或一秒) 向 server 或 application 發出的 request 數量。 如果 request 超過限制,則速率限制器會阻止所有超出的調用。通常用於防止 server 同時被太多 request 淹沒,來維持 server 健康。例如:防止濫用、減少垃圾郵件。
想像一下您有一個程序,其中某些部分每秒執行次數不得超過一次。 您可以實現一個簡單的速率限制器,來強制執行此限制。
SimpleRateLimiter Class 有一個 is_allowed 方法,用於檢查當前時間 (monotonic()) 是否大於或等於 self.allow_request。
如果是,則意味著自上次允許執行以來已經過去了 1 秒 (或更多)。因此將 self.allow_request 設置為當前時間加 1 秒,並返回 True。 如果不是,則表示已經過去了不到 1 秒,所以返回 False。
在循環中,我們嘗試每 0.5 秒執行一些程式碼。 但我們設置的速率限制器只允許它每 1 秒執行一次。 因此,一半的執行嘗試將被阻止。
執行結果:
速率限制器 – 正式版
速率限制器 – Pythonic
在此示例中,rate_limited 是一個 decorator factory。 它將每秒最大調用次數作為輸入,並返回一個 decorator。
這種方法可以說更Pythonic,因為它將速率限制邏輯封裝到單個 decorator 中,然後只需在函數定義之前添加 @rate_limited(max_calls_per_second) 即可輕鬆應用於任何函數。
範例 – Token 存儲桶速率限制器
該程式碼實現了一種稱為 token bucket (桶) 的速率限制策略。重新填充的 Tokens 數量永遠不會超過 max_rate。 Request 消耗存儲桶中的 Token。 如果桶中沒有剩餘 Tokens,則 request 將被丟棄或排隊等待稍後處理。
如果 Token 被消耗,則返回 True。 如果自上次消耗 Token 以來,沒有重新填充足夠的 Token,則返回 False。 在這種情況下,程序會休眠一小段時間,然後再重試。
執行結果:
perf_counter(), perf_counter_ns()
perf_counter() 具有最高可用解析度的時鐘 (最精確的可用計時器),常用於測量短的持續時間。 返回 Performance Counter (效能計數器) 的值 (以秒為單位)。返回值的參考點是未定義的,因此只有兩次調用結果之間的差異才有效。
perf_counter_ns() 與 perf_counter() 類似,但以奈秒 (nanoseconds) 為單位。可以避免 float 帶來的精準度損失。
process_time(), process_time_ns()
process_time() 返回當前 process 的系統和使用者 CPU 時間的總和。 它不包括睡眠期間經過的時間 (sleep())。 返回值的參考點是未定義的,因此只有兩次調用結果之間的差異才有效。
process_time_ns() 與 process_time() 類似,但以奈秒 (nanoseconds) 為單位。可以避免 float 帶來的精準度損失。
thread_time(), thread_time_ns()
返回當前 thread 的系統和使用者 CPU 時間之和的值 (以秒為單位)。 它不包括睡眠期間經過的時間 (sleep())。返回值的參考點是未定義的,因此只有同一 thread 中兩次調用結果之間的差異才有效。
thread_time_ns() 與 thread_time() 類似,但以奈秒 (nanoseconds) 為單位。可以避免 float 帶來的精準度損失。
執行結果:
Last updated
Was this helpful?