python比c+快吗+;对于http请求?

python比c+快吗+;对于http请求?,python,c++,performance,Python,C++,Performance,我有一个用python3.6编写的程序,现在我想用c++重新编写它,以加快速度。在这样做之前,我决定做一个小测试来推断我将获得多少速度。这个程序会发出很多http请求,所以我决定测试http请求的速度。但是我对结果非常惊讶,因为Python在每个请求中的平均C++代码速度比 > 50ms (有时是代码>100ms 有时是代码> ~10ms ),我不明白为什么。 这是我的C++代码: #include "swish/swish.h" #include <chrono> int ma

我有一个用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;
}

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

区别可能是因为python有一种非常优化的页面请求方式,而您使用的
swish
lib/code没有

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

如果有人有疑问,有一些方法可以加快这类事情的速度,这会产生影响。或者只是
选择
调用中的超时


说到网络,语言不是瓶颈,而是网络。因此,如果您对库的性能不满意,您应该更改库而不是语言。

区别可能是因为Python有一种非常优化的页面请求方式,而您使用的
swish
lib/代码没有

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

如果有人有疑问,有一些方法可以加快这类事情的速度,这会产生影响。或者只是
选择
调用中的超时


说到网络,语言不是瓶颈,而是网络。因此,如果您对库的性能不满意,您应该更改库而不是语言。

在处理任何类型的I/O(特别是网络I/O)时,实际I/O的速度要慢得多。无论使用何种语言,调用I/O的代码都要快一个或多个数量级。相反,请考虑如何处理所获取的数据,以及您最熟悉的语言和API。最后,程序员的时间通常比计算机的运行时间更昂贵,特别是如果程序的运行时间是以秒而不是以小时计算的话。在后台,CPython标准解释程序是用C语言编写的。因此,Python脚本的速度不能超过等效的C(或C++)代码。但一旦涉及到更多的图书馆,它们就会起作用。在这里,您的测试让Python请求库比C++ SISIE更优化(或者做更少的事情)。一个有趣的问题是,它们是否等待服务器完全接收到响应。Python标准的urllib.request库不支持,只要标题可用,就会返回。所以你可能在比较不同的东西。我很少发送请求而不加载完整的响应。。。在做出部分结论之前,构建一个更完整的测试:发送请求并读取响应。但由于这是IO限制的,我很惊讶你会发现非常不同的时间:大部分时间都应该花在IO部分…这太网络限制了,语言方面不重要。对于一个发出大量网络请求的程序,你最好重构python,以便它能有效地并行它们,例如,通过使用aiohttp或其他协同程序库。实际发送http请求所花费的cpu时间大约为1微秒,即使对于python也是如此。在处理任何类型的I/O(特别是网络I/O)时,实际的I/O速度都会非常慢。无论使用何种语言,调用I/O的代码都要快一个或多个数量级。相反,请考虑如何处理所获取的数据,以及您最熟悉的语言和API。最后,程序员的时间通常比计算机的运行时间更昂贵,特别是如果程序的运行时间是以秒而不是以小时计算的话。在后台,CPython标准解释程序是用C语言编写的。因此,Python脚本的速度不能超过等效的C(或C++)代码。但一旦涉及到更多的图书馆,它们就会起作用。在这里,您的测试让Python请求库比C++ SISIE更优化(或者做更少的事情)。有趣的一点是
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)