Python 回瓶反应非常慢

Python 回瓶反应非常慢,python,web,bottle,Python,Web,Bottle,我已经创建了两种不同的方式从我的路线装饰功能之一返回: 方法1: return HTTPResponse(status=200, body=myBody) 方法2(现在,这样做是为了让after_请求钩子读取相同的响应对象): myBody是一个字符串,而不是dict(我们的上游库已经通过json.dumps()将dict转换为字符串),而且myBody也很大:它是一个带有1个键的字典,但值是一个600多个成员的列表 我的问题是: 方法1非常快地返回到调用客户端(客户端通过POST请求使用请求

我已经创建了两种不同的方式从我的路线装饰功能之一返回:

方法1:

return HTTPResponse(status=200, body=myBody)
方法2(现在,这样做是为了让after_请求钩子读取相同的响应对象):

myBody是一个字符串,而不是dict(我们的上游库已经通过json.dumps()将dict转换为字符串),而且myBody也很大:它是一个带有1个键的字典,但值是一个600多个成员的列表

我的问题是: 方法1非常快地返回到调用客户端(客户端通过POST请求使用请求库)

方法2的速度大约慢10倍(调用客户机等待大约2分钟以获得响应,而方法1的等待时间为2秒)

我还禁用了任何
after\u hook
逻辑,以隔离任何其他效果

任何关于根本原因的提示?

返回大字符串的最有效(最快)的方法就是简单地返回一个iterable。例如:

return [myBody]
特别是:(1)不要复制响应对象,(2)200是默认的响应代码,因此不需要指定它


问:为什么我要返回一个列表(包含一个字符串),而不仅仅是字符串

答:我们可以
返回myBody
,但
返回[myBody]
是首选:

应用程序必须返回可生成字节字符串的iterable。您可以返回字符串(因为字符串是可编辑的),但这会导致大多数服务器逐字符传输您的内容


为什么要复制响应而不是执行响应?@eatmeimadanish无论哪种方式,速度都很慢。只是好奇:一个典型的
myBody
有多少字节?@ronrothmanℝℝ 它是2.4兆字节。好的,是的,这足够大了,我希望看到性能上的不同。谢谢。除了不复制响应对象之外,您认为不将其作为列表传输会导致响应速度变慢吗?但是为什么将它作为HTTPResponse传递给myBody(也不是列表)不会导致速度变慢呢?是的,我猜复制响应会对性能造成更大的伤害。但只是一个猜测——幸运的是,它很容易测试出来。让我们知道发生了什么,我很想知道返回[我的身体]现在快多了。copy()并没有太慢。但是,当我将我的身体发送到HTTPresponse并返回HTTPresponse时,为什么不慢呢?我不应该也发送[myBody]吗?不,当您创建一个新的响应对象时,它是一个不同的代码路径。我猜你的琴弦很大!
return [myBody]