2015-04-22 60 views
0

我比较这两段代码:Python的请求库 - 奇怪的行为VS卷发

subprocess.call('curl -XGET http://localhost:81/proxy/bparc/my_key > /dev/null' ,shell=True) 

VS

response = requests.get('http://localhost:81/proxy/bparc/my_key') 
print len(response.text) 

,第一个将始终在0.01秒运行英寸但是第二次有时会花费30秒,而其他时间则会少于0.01秒。

任何想法可能会发生什么?请求是否做了一些让事情放缓的事情?运行len不好吗?

+0

运行'len'并不“坏”。它可能是相关的 - 也许'curl'一旦看到你不想输出就停止读数据,而'request'不能这样做,因为len(response.text)需要输出。但我不认为'curl'实际上是这样做的,所以... – abarnert

+0

是的,requests.get步骤是即时的,所以我想它不会下载数据,直到您尝试访问它?我想知道是要求response.text导致它对数据进行一些处理。我不确定为什么只有特定的网址。 – Greg

+0

正确; 'requests.get'基本上只读取一个数据包(除非它只需要响应头部分);访问'文本'下载一切。但除了下载之外,它所做的唯一处理就是将字节解码为unicode,这应该只需要很短的时间。 – abarnert

回答

0

好的,改为response.content修复它。 response.text做了很多额外的东西,你不需要二进制数据。

response = requests.get('http://localhost:81/proxy/bparc/my_key') 
print len(response.content) 
+0

反应不是实际的文字吗?在这种情况下,特别是如果你使用Python 2.6或3.0,但也可能使用2.7和3.1+,我可以想象解码需要很长时间。旧版本的代码必须为每一个无法解码的字符调用一个函数,并且无法将其短路。 – abarnert

+0

无论如何,'r.text'基本上就是'r.content.decode(r.encoding)',它不是“很多额外的东西”,它只是一个额外的东西。 “内容”中已经发生了其他一切(gzip解码等)。 – abarnert

+0

这不是文字,它是二进制数据。这看起来就是这个问题。 – Greg