gpt4 book ai didi

python - 为什么 Python 的请求比 C 的 libcurl 快 10 倍?

转载 作者:行者123 更新时间:2023-12-04 11:08:12 27 4
gpt4 key购买 nike

Python的requests库似乎比 C 快 10 倍 libcurl (C API、CLI 应用程序和 Python API)对于 1.6 MB 的请求( requests 需要 800 毫秒 ,而 curl/libcurl 有时需要 56 秒 |79194 )。

  • 为什么是这样?
  • 我怎样才能得到curl在 C 中运行速度与 requests 一样快在 Python 中?
  • libcurl似乎以 16KB 块的形式得到答复,而请求似乎立即得到了整个事情,但我不确定这是不是...我试过 curl_easy_setopt(curl_get, CURLOPT_BUFFERSIZE, 1<<19)但让缓冲区大小变小似乎是件好事。
    我试过查看 source coderequests ,我认为它使用 urllib3作为其 HTTP“后端”...但使用 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, CURLOPT_BUFFERSIZE, 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'))
    curl https://api.binance.com/api/v3/exchangeInfo

    最佳答案

    加快 Web 内容传输速度的一种方法是使用 HTTP compression .这是通过在服务器和客户端之间发送数据之前即时压缩数据来实现的,因此传输时间更少。
    虽然 HTTP compression is supported by libcurl ,默认情况下是禁用的:。来自 CURLOPT_ACCEPT_ENCODING文档:

    Set CURLOPT_ACCEPT_ENCODING to NULL to explicitly disable it, whichmakes libcurl not send an Accept-Encoding: header and not decompressreceived contents automatically.


    这个参数的默认值是NULL,所以除非你特地启用了HTTP压缩,否则你不会得到它。

    关于python - 为什么 Python 的请求比 C 的 libcurl 快 10 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68207864/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com