我有一个python代码,可以使用requests
模块从HTTP API中恢复信息。这段代码一遍又一遍地运行,每次调用之间的间隔为几毫秒。
我呼叫的HTTP API可以向我发送3种不同的响应,可以是:
'EMPTYFRAME'
,状态为200
'CAMERAUNAVAILABLE'
,状态为200
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
提供了更快方式以确保收到图片。
答案 0 :(得分:1)
比较整个r.text
(可能包含JPEG字节)可能很慢。
您可以比较服务器应设置的Content-Type
标头:
ct = r.headers['content-type']
if ct == "text/plain":
# check for CAMERAUNAVAILABLE or EMPTYFRAME
else:
# this is a JPEG