web-dev-qa-db-ja.com

Pythonリクエストvs PyCurlパフォーマンス

RequestsライブラリはPyCurlのパフォーマンスと比較してどうですか?

私の理解では、Requestsはpython urllibのラッパーである一方、PyCurlはpython libcurlのネイティブラッパーであるため、PyCurlはより良いパフォーマンスを得るが、確かにいくらですか。

比較するベンチマークを見つけることができません。

39
Eugene

私はあなたに完全なベンチマークを書きました、些細なFlask gUnicorn/meinheld + nginx(パフォーマンスおよびHTTPS用)、10,000リクエストを完了するのにかかる時間の確認テストは、アンロードされたc4.largeインスタンスのペアでAWSで実行され、サーバーインスタンスはCPU制限されませんでした。

TL; DR summary:多くのネットワークを使用している場合は、PyCurlを使用し、そうでない場合はリクエストを使用します。 PyCurlは、小さなリクエストを大きなリクエストで帯域幅の制限(ここでは約520 MBitまたは65 MB/s)に達するまでリクエストの2倍から3倍の速度で終了し、3倍から10倍少ないCPU電力を使用します。これらの図は、接続プールの動作が同じ場合を比較しています。デフォルトでは、PyCurlは接続プールとDNSキャッシュを使用しますが、リクエストは使用しません。そのため、素朴な実装は10倍遅くなります。

Combined-chart-RPSCPU Time by request size detailed

Just HTTP throughputJust HTTP RPS

桁数が関係するため、二重対数プロットは下のグラフにのみ使用されることに注意してくださいHTTP & HTTPS throughputHTTP & HTTPS RPS

  • pycurlは、接続を再利用するときにリクエストを発行するのに約73 CPUマイクロ秒かかります
  • リクエストは、接続を再利用するときにリクエストを発行するのに約526 CPUマイクロ秒かかります
  • pycurlは新しい接続を開くに約165 CPUマイクロ秒かかり、リクエストを発行します(接続の再利用なし)、または開くのに〜92マイクロ秒かかります
  • リクエストには約1078CPUマイクロ秒がかかり、新しい接続を開くしてリクエストを発行します(接続の再利用なし) 、または〜552マイクロ秒で開く

完全な結果はリンクにあります 、およびベンチマーク手法とシステム構成。

警告:結果を科学的な方法で収集するために苦労しましたが、1つのシステムタイプと1つのオペレーティングシステムのみをテストしています。パフォーマンスの限られたサブセット、特にHTTPSオプション。

84
BobMcGee

何よりもまず、requestsurllib3 library 、stdlib urllibまたはurllib2ライブラリはまったく使用されません。

パフォーマンスに関してrequestspycurlを比較する意味はほとんどありません。 pycurlはその作業にCコードを使用する場合がありますが、すべてのネットワークプログラミングと同様に、実行速度はマシンをターゲットサーバーから分離するネットワークに大きく依存します。さらに、ターゲットサーバーの応答が遅くなる可能性があります。

最終的に、requestsにははるかに使いやすいAPIがあり、その使いやすいAPIを使用すると生産性が向上することがわかります。

16
Martijn Pieters

サイズに焦点を当てる-

  1. 8GBのRAMと512GB SSD、1秒間に3キロバイト(インターネットとwifiから)で着信する100MBファイル)、pycurl、curl、requestsライブラリのgetのMac Book Airでは関数(チャンクまたはストリーミングに関係なく)はほとんど同じです。

  2. 小さい クアッドコアIntel Linuxボックス 4GB RAM、ローカルホスト経由(同じボックスのApacheから)、1GBファイルの場合、curlとpycurlは 'requests'ライブラリよりも2.5倍高速です。また、チャンクとストリーミングを同時にリクエストすると、10%のブーストが得られます(50,000を超えるチャンクサイズ)。

Pycurlのリクエストを交換する必要があると思っていましたが、作成しているアプリケーションがクライアントとサーバーを閉じることはないのでそうではありません。

1
paul_h