超级性能比较

时间:2015-04-09 09:37:46

标签: python performance

我有一个python代码,可以使用requests模块从HTTP API中恢复信息。这段代码一遍又一遍地运行,每次调用之间的间隔为几毫秒。

我呼叫的HTTP API可以向我发送3种不同的响应,可以是:

  • 文字'EMPTYFRAME',状态为200
  • 文字'CAMERAUNAVAILABLE',状态为200
  • HTTP状态为200
  • 的JPEG图像

这是处理这种情况的代码的一部分:

   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提供了更快方式以确保收到图片。

1 个答案:

答案 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