在Python的requests庫中,當我們發送一個請求后,會得到一個Response對象,這個對象有一個elapsed屬性,它返回一個timedelta對象,表示從發送請求到收到響應所經過的時間。
response.elapsed.total_seconds()
?是 Python?requests
?庫中的一個方法,用于獲取 HTTP 請求從發送到接收響應所花費的總時間(以秒為單位,浮點數形式)。以下是具體用法和示例:
?基本用法?
import requestsresponse = requests.get("https://www.example.com")
elapsed_time = response.elapsed.total_seconds() # 獲取請求耗時(秒)
print(f"請求耗時: {elapsed_time} 秒")
?完整示例?
1. 測量請求耗時并處理超時
import requestsurl = "https://www.example.com"
try:response = requests.get(url, timeout=5) # 設置超時時間為5秒elapsed = response.elapsed.total_seconds()print(f"請求成功!狀態碼: {response.status_code}, 耗時: {elapsed:.3f} 秒")
except requests.exceptions.Timeout:print("請求超時!")
except requests.exceptions.RequestException as e:print(f"請求失敗: {e}")
2. 比較多個請求的耗時
import requestsurls = ["https://www.google.com","https://www.github.com","https://www.python.org"
]for url in urls:try:response = requests.get(url)elapsed = response.elapsed.total_seconds()print(f"{url} 耗時: {elapsed:.2f} 秒")except Exception as e:print(f"{url} 請求出錯: {e}")
3. 結合性能測試(計算平均耗時)
import requests
import statisticsurl = "https://www.example.com"
times = []for _ in range(5): # 發送5次請求,計算平均耗時response = requests.get(url)times.append(response.elapsed.total_seconds())avg_time = statistics.mean(times)
print(f"平均耗時: {avg_time:.3f} 秒")
elapsed時間包括請求發送、服務器處理以及響應返回的時間,但不包括DNS解析、連接池等待等時間(實際上,elapsed是從發送請求開始到響應返回為止的時間,包括連接建立的時間,如果連接是新建的,則包括DNS解析和TCP連接建立的時間。但是,如果使用了會話(Session)并且連接是復用的,那么elapsed就不包括連接建立的時間)。
?關鍵說明?
- ?
response.elapsed
?是一個?datetime.timedelta
?對象,total_seconds()
?將其轉換為秒。 - ?適用場景?:性能監控、API響應時間分析、超時處理等。
- ?注意事項?:
- 如果請求失敗(如超時或網絡錯誤),
response
?對象可能不存在,需配合異常處理使用。 - 時間不包括DNS解析、TCP連接等底層網絡開銷,僅測量從發送請求到接收第一個字節的時間。
- 如果請求失敗(如超時或網絡錯誤),
?輸出示例?
請求成功!狀態碼: 200, 耗時: 0.452 秒
https://www.google.com 耗時: 0.32 秒
https://www.github.com 耗時: 0.87 秒
平均耗時: 0.512 秒
通過這種方法,你可以方便地監控和優化請求性能。
什么是elapsed屬性?
在Python的requests
庫中,elapsed
是一個屬性,它返回一個timedelta
對象,表示從發送HTTP請求到接收到響應所經過的時間。
import requests# 發送HTTP請求
response = requests.get('https://www.baidu.com')# 獲取響應時間
response_time = response.elapsed
print(f"響應時間: {response_time}")
print(f"總秒數: {response_time.total_seconds()}秒")# 響應時間: 0:00:00.062012
# 總秒數: 0.062012秒
elapsed
屬性非常有用,特別是在需要監控API性能或確保服務響應時間符合SLA(服務級別協議)時。
理解timedelta對象
timedelta
是Python?datetime
模塊中的一個類,用于表示時間間隔或持續時間
timedelta的主要屬性:
days
?- 天數seconds
?- 秒數(不包括天數部分)microseconds
?- 微秒數(不包括天數和秒數部分)
常用的方法:
total_seconds()
?- 返回總秒數(包括天、秒和微秒轉換后的秒數)
from datetime import timedelta# 創建timedelta對象
delta = timedelta(days=1, hours=3, minutes=30, seconds=15)print(f"天數: {delta.days}")
print(f"秒數: {delta.seconds}") # 輸出: 12615 (3 * 3600 + 30 * 60 + 15)
print(f"總秒數: {delta.total_seconds()}") # 輸出: 99015.0 (86400 + 12615)# 天數: 1
# 秒數: 12615
# 總秒數: 99015.0
elapsed與timedelta的實際應用
在HTTP請求中,response.elapsed
返回一個timedelta
對象,我們可以使用它來:
- 檢查響應時間是否在可接受范圍內
- 記錄API性能指標
- 設置超時閾值
- 比較不同端點或服務的性能
import requestsresponse = requests.get('https://www.baidu.com')# 斷言響應時間小于1秒
assert response.elapsed.total_seconds() < 1.0, f"響應時間過長: {response.elapsed.total_seconds()}秒"# 記錄響應時間
print(f"請求完成,耗時: {response.elapsed.total_seconds():.3f}秒")# 獲取詳細的各部分時間
print(f"天數: {response.elapsed.days}")
print(f"秒數: {response.elapsed.seconds}")
print(f"微秒數: {response.elapsed.microseconds}")
print(f"總秒數: {response.elapsed.total_seconds()}")
# 請求完成,耗時: 0.046秒
# 天數: 0
# 秒數: 0
# 微秒數: 45978
# 總秒數: 0.045978