請求庫如何與PyCurl性能相比較?Python請求與PyCurl性能
我的理解是Requests是urllib的python包裝器,而PyCurl是libcurl的python包裝器,它是本地的,所以PyCurl應該獲得更好的性能,但不知道多少。
我找不到任何比較基準。
請求庫如何與PyCurl性能相比較?Python請求與PyCurl性能
我的理解是Requests是urllib的python包裝器,而PyCurl是libcurl的python包裝器,它是本地的,所以PyCurl應該獲得更好的性能,但不知道多少。
我找不到任何比較基準。
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倍。
Full results are in the link,以及基準方法和系統配置。
注意事項:雖然我不厭其煩地保證結果科學地收集,這只是一個測試系統類型和一個操作系統,性能有限的子集,尤其是HTTPS選項。
首先,requests
構建在urllib3
library的頂部,stdlib urllib
或urllib2
庫根本不被使用。
在性能上比較requests
與pycurl
毫無意義。 pycurl
可能使用C代碼進行工作,但與所有網絡編程一樣,執行速度在很大程度上取決於將您的機器與目標服務器分開的網絡。而且,目標服務器的響應速度可能會很慢。
最後,requests
有一個更友好的API可供使用,並且您會發現使用這個友好的API可以提高工作效率。
我同意對於大多數應用程序來說,請求的乾淨API最重要;但對於網絡密集型應用程序,沒有任何藉口*不*使用pycurl。開銷可能很重要(特別是在數據中心內)。 – BobMcGee 2015-10-02 03:06:40
@BobMcGee:如果網絡速度太高以至於開銷會很重要,那麼您就不應該再爲整個應用程序使用Python了。 – 2015-10-02 07:46:15
@Martijn_Pieters不同意 - python性能並不差,一般來說,將性能敏感的位委託給本地庫是非常容易的(pycurl就是一個很好的例子)。 DropBox可以使它工作,而yum內部使用pycurl(因爲它的許多工作只是網絡提取,它需要儘可能快)。 – BobMcGee 2015-10-02 12:00:10
集中於大小 -
在我的Mac書航8GB的RAM和512GB固態硬盤,以3千字節第二進來一個100MB的文件(從互聯網和WiFi),pycurl, curl和請求庫的get函數(不管分塊還是流)都幾乎相同。
在一個較小的Quad core Intel Linux box與4GB的RAM,通過本地主機(從Apache在同一個盒子),對於1GB文件,curl和pycurl比'請求'庫快2.5倍。對於請求分塊和流式傳輸可以提高10%(大於50,000的塊大小)。
我想我不得不換請求出去pycurl,但不能使我做不會有客戶端和服務器關閉應用程序。
你的基準很好,但是localhost沒有任何網絡層開銷。如果您可以在實際的網絡速度下限制數據傳輸速度,使用逼真的響應大小('乒乓'是不現實的),並且包括內容編碼模式混合(有和沒有壓縮),然後*然後*生成基於那麼,你就會擁有具有實際意義的基準數據。 – 2015-10-02 07:47:41
我還注意到,你將pycurl的設置移出了循環(設置URL和writedata目標應該是循環的一部分),並且不要讀出'cStringIO'緩衝區;非pycurl測試都必須以Python字符串對象的形式產生響應。 – 2015-10-02 07:52:22
@MartijnPieters缺乏網絡開銷是故意的;這裏的意圖是單獨測試客戶端。該URL可以在那裏插入,所以你可以根據你選擇的真實的現場服務器來測試它(默認情況下它不會,因爲我不想錘擊某人的系統)。 **注意:** pycurl的後期測試通過body.getvalue讀出響應體,性能非常相似。如果您可以提出改進建議,則歡迎PR代碼。 – BobMcGee 2015-10-02 12:29:41