[英]Super-performatic comparison
我有一個python代碼,可以使用requests
模塊從HTTP API恢復信息。 每次調用之間以幾毫秒的間隔一次又一次地運行此代碼。
我正在調用的HTTP API可以向我發送3種不同的響應,可以是:
200
文本'EMPTYFRAME'
200
文本'CAMERAUNAVAILABLE'
200
這是處理這種情況的代碼的一部分:
try:
r = requests.get(url,
auth=(username, pwd),
params={
'camera': camera_id,
'ds': int((datetime.now() - datetime.utcfromtimestamp(0)).total_seconds())
}
)
if r.text == 'CAMERAUNAVAILABLE':
raise CameraManager.CameraUnavailableException()
elif r.text == 'EMPTYFRAME':
raise CameraManager.EmptyFrameException()
else:
return r.content
except ConnectionError:
# handles the error - not important here
關鍵部分是if
/ elif
/ else
部分,此比較花費的時間太長,無法完成,如果我將其完全刪除並簡單地將其替換為return r.content
,則我具有想要的性能,但是請檢查其他兩個圖像以外的響應對於應用程序流程很重要。
我也嘗試過:
if len(r.text) == len('CAMERAUNAVAILABLE'):
raise CameraManager.CameraUnavailableException()
elif len(r.text) == len('EMPTYFRAME'):
raise CameraManager.EmptyFrameException()
else:
return r.content
和:
if r.text[:17] == 'CAMERAUNAVAILABLE':
raise CameraManager.CameraUnavailableException()
elif r.text[:10] == 'EMPTYFRAME':
raise CameraManager.EmptyFrameException()
else:
return r.content
這使其速度更快,但仍不如我認為的快。
有沒有辦法優化這種比較?
編輯
有了可接受的答案,最終代碼如下:
if r.headers['content-type'] == 'image/jpeg':
return r.content
elif len(r.text) == len('CAMERAUNAVAILABLE'):
raise CameraManager.CameraUnavailableException()
elif len(r.text) == len('EMPTYFRAME'):
raise CameraManager.EmptyFrameException()
檢查響應的Content-Type
提供了一種確保收到圖像的更快方法。
比較整個r.text
(可能包含JPEG字節)可能很慢。
您可以比較服務器應設置的Content-Type
標頭:
ct = r.headers['content-type']
if ct == "text/plain":
# check for CAMERAUNAVAILABLE or EMPTYFRAME
else:
# this is a JPEG
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.