2013-03-17 3 views
21

Как библиотека запросов сравнивается с характеристикой PyCurl?Python Requests vs PyCurl Performance

Я понимаю, что Requests - это оболочка python для urllib, тогда как PyCurl - это оболочка python для libcurl, которая является родной, поэтому PyCurl должен получать лучшую производительность, но не уверен, насколько.

Я не могу найти сравнительные тесты.

ответ

52

I wrote you a full benchmark, используя тривиальное приложение Flask подкрепленной gUnicorn/meinheld + Nginx (для повышения производительности и HTTPS), и видя, сколько времени требуется для завершения 10000 запросов. Тесты выполняются в AWS на пару выгруженных экземпляров c4.large, а экземпляр сервера не ограничен ЦП.

TL; DR сводка: Если вы много работаете, используйте PyCurl, иначе используйте запросы. PyCurl заканчивает небольшие запросы 2x-3x так же быстро, как запросы, пока вы не достигли предела пропускной способности с большими запросами (около 520 Мбит или 65 МБ/с здесь) и использует от 3х до 10 раз меньше мощности ЦП. Эти цифры сравнивают случаи, когда поведение пула соединений одинаково; По умолчанию 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 не имеет сетевого уровня. Если вы можете ограничить скорость передачи данных на фактических скоростях сети, используя реалистичные размеры ответов ('pong' нереалистичен) и включает в себя сочетание режимов кодирования контента (с сжатием и без сжатия) и * затем * создавать тайминги на основе что тогда у вас будут контрольные данные с фактическим значением. –

+0

Я также отмечаю, что вы перенесли установку pycurl из цикла (установка URL-адреса и адреса writedata, возможно, должна быть частью цикла) и не считывать буфер 'cStringIO'; тесты non-pycurl все должны вызывать ответ как строковый объект Python. –

+1

@MartijnPieters Недостаток сетевых издержек преднамерен; целью здесь является тестирование клиента изолированно. URL-адрес подключается туда, поэтому вы можете протестировать его на реальном реальном сервере по вашему выбору (по умолчанию это не так, потому что я не хочу забивать чью-то систему). ** Ключевое примечание: ** более поздний тест pycurl считывает тело ответа через body.getvalue, а производительность очень схожа. PRs приветствуются для кода, если вы можете предложить улучшения. – BobMcGee

12

Прежде всего, requests построен на вершине urllib3 library, то STDLIB urllib или urllib2 библиотеки не используются.

Сравнивать requests с pycurl нет. pycurl может использовать код C для своей работы, но, как и все сетевое программирование, скорость выполнения зависит в основном от сети, которая отделяет ваш компьютер от целевого сервера. Более того, целевой сервер может медленно реагировать.

В конце концов, requests имеет гораздо более дружественный API для работы, и вы обнаружите, что будете более продуктивными с использованием этого более дружественного API.

+0

Я согласен с тем, что для большинства приложений самый чистый API запросов имеет наибольшее значение; но для приложений, интенсивно используемых в сети, нет никакого оправдания * не * для использования pycurl. Накладные расходы могут иметь значение (особенно в центре обработки данных). – BobMcGee

+0

@BobMcGee: если скорость сети настолько высока, что накладные расходы будут иметь значение, вы больше не должны использовать Python для всего приложения. –

+0

@Martijn_Pieters Не согласен - производительность python не так уж плоха, и в целом довольно легко делегировать чувствительные к производительности биты в родные библиотеки (что является хорошим примером для pycurl). DropBox может заставить его работать, и yum внутренне использует pycurl (поскольку большая часть его работы - это просто сетевые выборки, которые должны быть как можно быстрее). – BobMcGee

0

Сосредоточение на размер -

  1. На моем Mac Book Air с 8 Гб оперативной памяти и 512GB SSD, для 100MB файла поступающими на 3 килобайт в секунду (из интернета и Wi-Fi), pycurl, curl и функция получения запросов библиотеки (независимо от chunking или streaming) почти одинаковы.

  2. На меньшем Quad core Intel Linux box с 4 ГБ оперативной памяти, через локальный адрес (из Apache в том же поле), для 1 ГБ файла, завиток и pycurl в 2,5 раза быстрее, чем библиотека запросов. А для запросов chunking и streaming вместе дают 10% -ный прирост (размеры блоков выше 50 000).

Я думал, что придется поменять запросы за pycurl, но не так как приложения, я делаю это не будет иметь клиент и сервер, закрыть.