python - 对于http请求,python比c++更快吗?

标签 python c++ performance

我有一个用 python3.6 编写的程序,现在我想用 c++ 重新编写它以使其更快。在此之前,我决定进行一个小测试,以推断我能获得多少速度。该程序发出大量 http 请求,因此我决定测试 http 请求速度。但我对结果感到非常惊讶,因为 python 在每个请求中比 c++ 更快,平均 ~50ms(有时 ~100ms 有时 ~10ms >) 我不明白为什么。

这是我的 C++ 代码:

#include "swish/swish.h"
#include <chrono>


int main() {

  swish::Client httpclient = swish::Client();
  std::chrono::milliseconds since = std::chrono::duration_cast< std::chrono::milliseconds >(std::chrono::system_clock::now().time_since_epoch());
  std::pair<swish::Response<swish::ResponseHeaderBuffer>, swish::StatusCode> resp = httpclient.Get("https://api.btcturk.com/api/v2/ticker");
  std::chrono::milliseconds now = std::chrono::duration_cast< std::chrono::milliseconds >(std::chrono::system_clock::now().time_since_epoch());
  std::cout << now.count() - since.count() << std::endl;

  return 0;
}

我正在使用这个 swish http client 库(这只是curl包装器。这是库 repo )来发出请求并使用命令 clang++ testcpp.cpp 编译它-std=c++17 -o test -lcurl -O3

这是我的 Python 代码:

import time
import requests

current_milli_time = lambda: int(round(time.time() * 1000))


if __name__ == "__main__":
    since = current_milli_time()
    res = requests.get('https://api.btcturk.com/api/v2/ticker')
    now = current_milli_time()
    print(now - since)

是因为大部分毫秒是因为等待响应所以它完全与网络相关吗?但 python 每次都更快。我以不同的间隔尝试了20~30次。或者是因为这个库的Python代码确实经过了优化??

最佳答案

差异可能是因为 Python 有一种非常优化的页面请求方式,而您使用的 swish lib/code 却没有。

网络时间可能是相同的(事实上,它应该是相同的),但你真的无法知道(除非你开发了swish lib)什么那个图书馆正在做。 在 c++ 中请求网页可以通过多种方式完成,除非为这两种方式编写代码,否则没有人可以比较。 我想说你的方法(调用 swish )不是最佳的(但在所有情况下都很有用),而 Python 是为最佳“请求和等待响应”而设计的。 所以在这种情况下,Python 的优势在于有成千上万的用户报告反馈,从而允许开发人员对其进行优化。 Swish 可能没有那么多用户,可能没有那么多反馈,而且它不像 Python 那样优化(毕竟它调用 c。)

如果有人有疑问,有一些方法可以加快速度,例如 TCP_NODELAY这会有所作为。或者只是 select 调用中的超时。

当谈论网络时,语言不是瓶颈,而是网络。因此,如果您对库性能不满意,您应该更改而不是语言。

关于python - 对于http请求,python比c++更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62278057/

相关文章:

python - 使用 python 更改嵌套列表中的值

python - Python 2.5 是否包含一个包来本地转换 XML 文档?

c++ - 线程安全队列

C++模板特化方法定义

c++ - 如何实现在线裁判机器人?(例如TopCoder、Uva、ACM-ICPC)

python - lxml xml 解析,在 xml 标签内包含 html 标签

python - pydoc 创建不完整的文档

android - 减小 Android 应用程序大小

c# - 如果我在不同时间使用同一 Linq 查询的不同字段, Entity Framework 是否会多次查询数据库?

database - 访问远程数据库的最佳方式 : via webservice or direct DB-access?