2013-03-17 152 views
21

請求庫如何與PyCurl性能相比較?Python請求與PyCurl性能

我的理解是Requests是urllib的python包裝器,而PyCurl是libcurl的python包裝器,它是本地的,所以PyCurl應該獲得更好的性能,但不知道多少。

我找不到任何比較基準。

回答

52

I wrote you a full benchmark,使用gUnicorn支持一個簡單的瓶應用/ meinheld + nginx的(性能和HTTPS),看到需要多長時間才能完成10,000個請求。 AWS在一對卸載的c4.large實例上運行測試,並且服務器實例不受CPU限制。

TL; DR摘要:如果您正在進行大量網絡連接,請使用PyCurl,否則請使用請求。 PyCurl可以按照請求的速度快速完成2x-3x的請求,直到達到大請求的帶寬限制(這裏大約爲520 MB或65 MB/s),並使用3x至10x的CPU功耗。這些數字比較了連接池行爲相同的情況;默認情況下,PyCurl使用連接池和DNS緩存,而請求沒有,所以一個天真的實現將會慢10倍。

Combined-chart-RPS CPU Time by request size detailed

Just HTTP throughput Just HTTP RPS

注意,雙對數曲線僅用於從下面的圖中,由於幅度所涉及的訂單 HTTP & HTTPS throughput HTTP & HTTPS RPS

  • pycurl需要大約73 CPU微秒發出請求重用連接
  • 請求大約需要526 CPU微秒發出請求重用連接
  • pycurl大約需要165 CPU微秒至打開時,當新的連接和發出請求(無連接複用),或〜92微秒打開
  • 請求大約需要 CPU微秒至打開一個新的連接和發出請求(無連接複用),或〜 552微秒打開

Full results are in the link,以及基準方法和系統配置。

注意事項:雖然我不厭其煩地保證結果科學地收集,這只是一個測試系統類型和一個操作系統,性能有限的子集,尤其是HTTPS選項。

+2

你的基準很好,但是localhost沒有任何網絡層開銷。如果您可以在實際的網絡速度下限制數據傳輸速度,使用逼真的響應大小('乒乓'是不現實的),並且包括內容編碼模式混合(有和沒有壓縮),然後*然後*生成基於那麼,你就會擁有具有實際意義的基準數據。 – 2015-10-02 07:47:41

+0

我還注意到,你將pycurl的設置移出了循環(設置URL和writedata目標應該是循環的一部分),並且不要讀出'cStringIO'緩衝區;非pycurl測試都必須以Python字符串對象的形式產生響應。 – 2015-10-02 07:52:22

+1

@MartijnPieters缺乏網絡開銷是故意的;這裏的意圖是單獨測試客戶端。該URL可以在那裏插入,所以你可以根據你選擇的真實的現場服務器來測試它(默認情況下它不會,因爲我不想錘擊某人的系統)。 **注意:** pycurl的後期測試通過​​body.getvalue讀出響應體,性能非常相似。如果您可以提出改進建議,則歡迎PR代碼。 – BobMcGee 2015-10-02 12:29:41

12

首先,requests構建在urllib3 library的頂部,stdlib urlliburllib2庫根本不被使用。

在性能上比較requestspycurl毫無意義。 pycurl可能使用C代碼進行工作,但與所有網絡編程一樣,執行速度在很大程度上取決於將您的機器與目標服務器分開的網絡。而且,目標服務器的響應速度可能會很慢。

最後,requests有一個更友好的API可供使用,並且您會發現使用這個友好的API可以提高工作效率。

+0

我同意對於大多數應用程序來說,請求的乾淨API最重要;但對於網絡密集型應用程序,沒有任何藉口*不*使用pycurl。開銷可能很重要(特別是在數據中心內)。 – BobMcGee 2015-10-02 03:06:40

+0

@BobMcGee:如果網絡速度太高以至於開銷會很重要,那麼您就不應該再爲整個應用程序使用Python了。 – 2015-10-02 07:46:15

+0

@Martijn_Pieters不同意 - python性能並不差,一般來說,將性能敏感的位委託給本地庫是非常容易的(pycurl就是一個很好的例子)。 DropBox可以使它工作,而yum內部使用pycurl(因爲它的許多工作只是網絡提取,它需要儘可能快)。 – BobMcGee 2015-10-02 12:00:10

0

集中於大小 -

  1. 在我的Mac書航8GB的RAM和512GB固態硬盤,以3千字節第二進來一個100MB的文件(從互聯網和WiFi),pycurl, curl和請求庫的get函數(不管分塊還是流)都幾乎相同。

  2. 在一個較小的Quad core Intel Linux box與4GB的RAM,通過本地主機(從Apache在同一個盒子),對於1GB文件,curl和pycurl比'請求'庫快2.5倍。對於請求分塊和流式傳輸可以提高10%(大於50,000的塊大小)。

我想我不得不換請求出去pycurl,但不能使我做不會有客戶端和服務器關閉應用程序。