1

基本的に、XML データを取得するためにヒットしている URL があります。エンドポイントは開示できませんが、次のことを行っています。

curl -v "http://my-url.com/some/endpoint"

200 OKを返し、コンテンツはほぼ即座に返されます。

Kenneth Reitz による requests モジュールを使用して、コンテンツを返すのに 30 秒かかる POST 要求と GET 要求の両方を用意しました。

このように使用すると:

from timeit import Timer

t = Timer(lambda: requests.get(myurl).content)
print t.timeit(number=1)
30.2136261463

毎回平均 30.2 秒かかります。私のPOSTリクエストと同じです。コンテンツを要求せずに status_code 応答のみを要求すると、stream=Trueを渡さない限り同じ状況になります。応答はすぐに取得できますが、コンテンツは取得できません。

私の混乱はcurlコマンド内にあります...応答とコンテンツの両方を10ミリ秒以内に取得します。Python テストでユーザー エージェントを偽造しようとしたり、get() 関数などに多数の引数を渡そうとしたりしました。curl と python-requests が私が認識していないリクエストを実行する方法には大きな違いがあるはずです。私は初心者なので、明らかな何かが欠けている場合は申し訳ありません。

また、これのために複数のマシン、複数のバージョンのcurl、python、さらにはPostmanなどのRESTクライアントを試したことにも言及したいと思います。オプションの 1 つは、テスト内で curl へのサブプロセス呼び出しを行うことだと理解していますが、それは良い考えですか?

編集:内容が気になります。応答コード (ヘッダー) をすぐに取得できることは承知しています。

前もって感謝します、

チホミール。

アップデート:

現在、テストで pycurl2 を使用しているため、すべてに python-requests を使用できることを望んでいたため、これは単なる回避策です。なぜ curl がこれほど高速なのか、まだ興味があります。

4

2 に答える 2

4

この質問にはまったく興味がないので、問題のあるリクエストの代わりに pycurl2 を使用するという独自の回避策を受け入れます。

そのうち遅いのは 2 つだけで、これを実行することで問題は解決しましたが、これは私が望んでいた解決策ではありません。

注: リクエストが遅い、または悪いと言っているわけではありません。これは、gzip 圧縮とバグのある長さの gzip 圧縮データを提供する GlassFish の問題のようです。curl/wget に影響しない理由を知りたかっただけです。

于 2013-10-04T05:03:05.050 に答える
1

やるべきことの1つは、次を使用することです。

requests.get(url, stream=False)

あなたが投稿したものの代わりに。詳細については、次のリンクを参照してください。

http://docs.python-requests.org/en/latest/user/advanced/

討論

  • Curl は実行可能ファイルです。
  • Python はインタープリター言語です。

その結果、Python の「起動」時間は curl よりもはるかに遅くなり、IO が CPU バウンドであるにもかかわらず、速度が比較的遅くなります。これは、インタープリター言語を使用することのトレードオフの 1 つです。しかし、一般的に実行速度は比較的遅くなりますが、開発とメンテナンスの時間はその「損失」をはるかに上回ります。(注:私は一般的に言いました)。

あなたが言うように、考えられる解決策の1つは、Pythonを使用してcurlをスクリプトにラップすることです-これは悪い考えではありませんが、考慮すべき競合状態があるため、気にせずに悲惨な問題(使用状況によっては、ファイルの削除など)につながる可能性があります.

もう 1 つのアプローチは、元の Python コードを C/C++ のような言語に分解しようとすることです。これにより、それをコンパイルして、希望するほぼ同等のパフォーマンスを得ることができます。例では、shedSkin と Cython を使用しています。

于 2013-09-25T04:29:26.613 に答える