如何解决为什么 Python 的请求比 C 的 libcurl 快 10 倍?
对于 1.6 MB 的请求(requests
需要 800 毫秒,而 requests
/curl
有时需要 7 秒)。
-
这是为什么?
-
如何让 C 中的
libcurl
与 Python 中的curl
一样快?
requests
似乎以 16KB 块的形式得到回复,而请求似乎一次得到了整个事情,但我不确定是不是这样......我试过 libcurl
但它使缓冲区大小更小似乎很好。
我已经尝试查看 curl_easy_setopt(curl_get,CURLOPT_BUFFERSIZE,1<<19)
的 libcurl
,我认为它使用 requests
作为其 HTTP“后端”...但使用urllib3
直接导致与使用 urllib3
相同(令人失望)的结果。
这里有一些例子。
curl
/*
gcc-8 test.c -o test -lcurl && t ./test
*/
#include <curl/curl.h>
int main(){
CURLcode curl_st;
curl_global_init(CURL_GLOBAL_ALL);
CURL* curl_get = curl_easy_init();
curl_easy_setopt(curl_get,CURLOPT_URL,"https://api.binance.com/api/v3/exchangeInfo");
curl_easy_setopt(curl_get,1<<19);
curl_st=curl_easy_perform(curl_get); if(curl_st!=CURLE_OK) printf("\x1b[91mFAIL \x1b[37m%s\x1b[0m\n",curl_easy_strerror(curl_st));
curl_easy_cleanup(curl_get);
curl_global_cleanup();
}
'''FAST'''
import requests
reply = requests.get('https://api.binance.com/api/v3/exchangeInfo')
print(reply.text)
'''SLOW'''
import urllib3
pool = urllib3.PoolManager() # conn = pool.connection_from_url('https://api.binance.com/api/v3/exchangeInfo')
reply = pool.request('GET','https://api.binance.com/api/v3/exchangeInfo')
print(reply.data)
print(len(reply.data))
'''SLOW!'''
import urllib.request
with urllib.request.urlopen('https://api.binance.com/api/v3/exchangeInfo') as response:
html = response.read()
'''SLOW!'''
import pycurl
from io import BytesIO
buf = BytesIO()
curl = pycurl.Curl()
curl.setopt(curl.URL,'https://api.binance.com/api/v3/exchangeInfo')
curl.setopt(curl.WRITEDATA,buf)
curl.perform()
curl.close()
body = buf.getvalue() # Body is a byte string. We have to know the encoding in order to print it to a text file such as standard output.
print(body.decode('iso-8859-1'))
解决方法
加速网络内容传输的一种方法是使用HTTP compression。这是通过在服务器和客户端之间发送数据之前即时压缩数据来实现的,因此传输时间更短。
虽然HTTP compression is supported by libcurl,但默认情况下是禁用的:。来自 CURLOPT_ACCEPT_ENCODING
文档:
将 CURLOPT_ACCEPT_ENCODING 设置为 NULL 以显式禁用它,即 使 libcurl 不发送 Accept-Encoding: 标头且不解压缩 自动接收内容。
这个参数的默认值是NULL,所以除非你专门启用了HTTP压缩,否则你不会得到它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。