簡體   English   中英

Python請求模塊GET / POST +各種REST客戶端的請求花費的時間超過curl

[英]Python requests module GET/POST + various REST clients' requests taking longer than curl

基本上,我有一個網址,我想要獲取一些XML數據。 端點我不能透露,但做:

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

返回200 OK 和內容幾乎立即。

使用Kenneth Reitz的請求模塊,我有一個POST請求和一個GET請求,它們都需要30秒才能返回內容。

如果我這樣使用它:

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命令......我得到的響應和內容都在10ms以內。 我嘗試在我的python測試中偽造用戶代理,嘗試將大量參數傳遞給get()函數等。在curl和python-requests之間如何處理我不知道的請求之間必然存在一些主要區別。 我是新手,所以如果我遺漏了一些明顯的東西,我會道歉。

我還想提一下,我已經嘗試了多台機器,多個版本的curl,python甚至嘗試了一些REST客戶端,如Postman等。只有curl快速執行閃電 - 在每種情況下擊中相同的端點BTW。 我知道其中一個選項是在我的測試中做一個子進程調用curl,但是......這是個好主意嗎?

編輯:我關心的內容。 我知道我可以快速獲得響應代碼(標題)。

提前致謝,

蒂霍米爾。

更新:

我現在在我的測試中使用pycurl2,所以這只是一種解決方法,因為我希望我可以使用python-requests來處理所有事情。 仍然好奇為什么卷曲這么快。

由於這個問題根本沒有引起任何興趣,我將接受我自己的解決方案 - 這涉及使用pycurl2而不是請求有問題的請求。

其中只有2個是慢的,這樣做解決了我的問題,但這不是我希望的解決方案。

注意:我不是以任何方式說請求是慢還是壞。 這似乎是gzip壓縮和GlassFish服務gzip數據與長度錯誤的問題。 我只是想知道它為什么不影響curl / wget。

要做的一件事是使用:

requests.get(url, stream=False)

而不是你發布的內容。 有關更多信息,請參閱此鏈

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

討論

  • Curl是一個可執行文件
  • Python是一種解釋型語言

因此,Python具有比curl慢得多的“啟動”時間,盡管IO受CPU限制,但它的速度相對較慢。 這是使用解釋語言的權衡之一。 但是,通常在執行速度相對較慢的情況下,開發和維護時間遠遠超過“損失”。 (注意:我說的一般 )。

正如你所說,一種可能的解決方案是使用Python將curl包裝在腳本中 - 這不是一個壞主意,但可能導致災難性問題(取決於使用情況,比如刪除文件),因為有競爭條件要考慮。

另一種方法是嘗試將原始Python代碼分解為類似C / C ++的語言,這樣您就可以編譯它並獲得您想要的等效性能。 示例使用shedSkin和Cython。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM