`
qiezi
  • 浏览: 495816 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C++/D/python性能一比

阅读更多
实际上不是全面测试性能。应该这么说:使用一个你熟悉的语言,用它写出一个高效的版本(做下面那件事)。

不小心读到一个帖子:http://blog.vckbase.com/jzhang/archive/2006/03/28/18807.html

看到C++竟然被比下去了,自然不是很舒服,毕竟C++对于C并没有太大的性能上的降低,而python是C写的(指Cpython实现),自然不会高过C。(废话,C基本上接近汇编效率了)

可惜C++又很难找出这么高效的实现,STL效率还是低了些(为什么?一直以为它很高效,用得比较放心)。最近一直比较关注D语言,于是用D语言来测试一下。代码如下:

<!----> 1 import std.stdio;
 2 import std.string;
 3 import std.perf;
 4 
 5 int main(char[][] argv)
 6 {
 7   if (argv.length < 3) {
 8     writefln("Wrong arguments");
 9     return 1;
10   }
11 
12   const int READ_SIZE = 1024;
13 
14   FILE* fin = fopen(argv[1], "r");
15   FILE* fout = fopen(argv[2], "w");
16   char buffer[READ_SIZE];
17   int[char[]] emails;
18 
19   PerformanceCounter counter = new PerformanceCounter();
20   counter.start();
21   while (!feof(fin)){
22     fgets(cast(char*)buffer, READ_SIZE, fin);
23     char[] email = toString(cast(char*)buffer);
24     if (!(email in emails)){
25       emails[toString(buffer)] = 0;
26       fputs(cast(char*)email, fout);
27     }
28   }
29 
30   fclose(fout);
31   fclose(fin);
32   counter.stop();
33 
34   writefln(counter.milliseconds());
35   return 0;
36 }
37 

没加fopen失败处理。

测试结果在我的机器上耗时只有python版本的1/3,我看到其它网友的C++实现最好成绩也不过1/2,由于是D是C语言所写,测试使用的又是C库,自然可以认为C语言还是比较高效的。

上面的D语言代码里调用了toString,把char*转为char[],它的源代码如下:
<!---->char[] toString(char *s)
{
    
return s ? s[0 .. strlen(s)] : cast(char[])null;
}

如果s[0 .. strlen(s)]产生了复制的话,应该是会影响性能的。char[]对象是受GC管理的,应该会复制一份。这种情况下还能有如此高的效率,的确很不错。

不过python的性能让我感觉很吃惊,以前只测试过字符串连接,感觉比较高效。

写了一个完成一样功能的ruby程序,耗时接近python版本的2倍,当然由于对它不是很熟,可能写得不够高效。
<!----> 1 emails = Hash.new
 2 
 3 start = Time.now
 4 fout = open('email-2-new1.txt''w')
 5 open('email-2.txt').each do |line|
 6   if !emails.has_key? line
 7     emails[line] = 0
 8     fout << line
 9   end
10 end
11 puts Time.now - start
12 

正如某网友所说,这个程序的瓶颈在于IO,拿来作性能上的比较或许是不合适的。从语言效率上来讲,自然是C++和D相当,可能会比D高,python应该会低很多。但在很多情况下,衡量效率不光是语言本身,还有库,没有库的语言是没什么吸引力的。python是一种很“慢”的语言,相对C/C++来说,不过它是一门实用性的语言,所以它为一些特定用法做了优化,取得了不错的成绩。C++是一门通用语言,或许太注重语言的性能了,忽略了库,导致库把性能给拉下来了。这种情况下,有人评测java和C++的性能,结果是java要高,自然是不那么让人惊奇的了。可是如果标准库都这么慢,那还能指望什么呢?

当然也并没有证明STL就特别慢,也可能是使用不正确。


只是刚好看到这个比较,忍不住参与一下,切勿当真。
分享到:
评论

相关推荐

    常见控制算法的c++/python版本代码实现

    开发者可以根据具体需求调整参数,优化控制性能,并通过C++或Python的代码实现将理论转化为实际应用。理解并掌握这些控制算法及其编程实现对于提升IT专业人士在自动化和控制领域的专业技能至关重要。

    跌倒检测,YOLOV8S,只依赖OPENCV,支持C++/PYTHON

    C++是底层编程语言,可以提供更好的性能和直接的内存控制,而Python则以其简洁的语法和丰富的科学计算库受到欢迎,适合快速原型开发和数据分析。 跌倒检测通常涉及到以下技术点: 1. **预处理**:OpenCV提供了一...

    python与C、C++混编的四种方式(小结)

    例如,在Python项目中引入C或C++代码以提高性能,或者在C/C++应用中嵌入Python脚本以增强灵活性。本文将详细介绍Python与C、C++混编的四种常见方式,并通过具体示例帮助读者理解其应用场景和技术细节。 #### 第一种...

    python32_d.dll和python32_d.lib

    其次,`python32_d.lib`是一个导入库文件,它包含了C++编译器需要知道的关于`python32_d.dll`的符号信息。在链接阶段,编译器会使用这个库来解析C++代码中对Python API的引用,并生成相应的调用到`python32_d.dll`的...

    每天学点C++(C++实例教程:教程+源码)调用python模块.zip

    在IT领域,C++是一种强大的、面向对象的编程语言,被广泛用于系统软件、游戏开发、设备驱动程序以及高性能计算等多个领域。而Python则是一种解释型、高级编程语言,以其简洁明了的语法和丰富的库支持深受开发者喜爱...

    python27_d.dll和python27_d.lib动态链接库文件

    3. **lib文件**:`python27_d.lib` 是一个导入库文件,它是C或C++编译器用来链接到`python27_d.dll`的。当编译Python扩展模块或者C/C++程序时,这个文件告诉编译器如何找到DLL中的函数和全局变量。在链接阶段,...

    c++-python 联合游戏

    标题 "c++-python 联合游戏" 暗示了这是一个结合了C++和Python编程语言的游戏项目。在游戏开发中,这样的组合可能是为了利用C++的强大性能和Python的易用性与丰富的库资源。C++通常用于编写游戏引擎、底层逻辑和高...

    python310-d.zip

    Python 3.10 是 Python 编程语言的最新版本之一,主要针对性能优化和语法改进进行了升级。在这个“python310-d.zip”压缩包中,包含了 x64(64位)架构下的调试版本的动态库(python310_d.dll)和静态库(python310_...

    python25_d.lib, python25_d.dll

    同样,`_d`后缀表明这是一个调试版本,它包含有调试符号,对于调试Python扩展或者使用Python调用的C/C++代码非常有用。 OpenCV是一个开源的计算机视觉库,它广泛应用于图像处理、机器学习和计算机视觉等领域。在...

    python2.7.5源码与python27_d.dll

    Python 2.7.5 源码与 `python27_d.dll` 和 `python27_d.lib` 文件是Python编程语言在Windows平台上的一个重要组成部分。这些文件在开发和调试Python程序时起着至关重要的作用。以下是关于这些知识点的详细说明: **...

    ca源码java-CardRaytracerBenchmark:这是简短的C++/Java/C#/Python基准测试。根据PaulHeckb

    估算性能指标。 得出结论 针对用户的简短说明: 下载并安装Java,Python,CSharp,Digital Mars D,GoLang,JavaScript环境。 运行“运行基准” 阅读报告。 开发者 梅顿 鲁斯兰(基隆) MasterZiv(masterziv) dr-...

    python27.dll python27_d.lib 文件

    3. **编译配置**:如果你在开发C或C++的Python扩展模块,必须确保使用与"python27_d.lib"匹配的编译选项和链接器设置。 4. **版本冲突**:如果你的系统上安装了多个Python版本,可能会出现版本混淆,确保你的程序...

    推荐一款python可以使用的游戏引擎.专为U3D打造的游戏服务器引擎

    综上所述,KBEngine是一款专为Unity 3D游戏设计的游戏服务器引擎,它的特点是服务端底层框架采用C++编写以确保高性能,而游戏逻辑层则使用Python,便于快速开发和维护。它还集成了MySQL数据库,并且有丰富的教程资源...

    python3.11离线安装依赖包

    7. **环境变量**:更新环境变量 `PATH`,使其包含新安装的 Python 解释器,通常在 `/etc/profile.d` 目录下创建一个脚本来实现,例如 `python3.sh`,并添加 `export PATH=/path/to/installation/directory/bin:$PATH...

    使用C(C++)扩展 Python(中文文档)

    通过这种方式,您可以利用C/C++的强大性能来实现Python难以完成的任务,比如直接调用C库函数或者进行系统调用。 ##### 创建扩展模块 首先,我们来创建一个名为`spam`的简单扩展模块,该模块将调用C库中的`system()...

    使用有限差分的3-D热方程的GPU求解器_C++_Python_下.zip

    标题中的“使用有限差分的3-D热方程的GPU求解器_C++_Python_下.zip”指示了这是一个关于利用GPU加速计算三维热扩散问题的项目,涉及到的主要技术包括有限差分法(Finite Difference Method)和GPU编程,使用的编程...

    使用C++调用Python代码的方法详解

    这是一个跨语言交互的重要技术,允许我们利用C++的高性能和Python的丰富库资源。 首先,配置Python环境至关重要。安装Python时,确保将其路径添加到系统环境变量中。这样,无论在哪一级别目录下,C++都能找到Python...

    python37_lib_32bit和python37_lib_64bit

    在Windows系统下,如果你正在开发一个需要与Python交互的项目,比如使用C++或C编写扩展模块,你需要链接到相应的Python库。这些库文件通常位于Python安装目录下的"libs"子目录,文件名为`python37_d.lib`(调试版本...

    python26_d 还有运行时的python26

    在这个压缩包中,我们看到了与 Python 2.6 运行环境相关的几个关键文件,分别是 `python26_d.dll`、`python26.dll`、`python26_d.lib` 和 `python26.lib`。 1. **动态链接库(.dll 文件)**: - `python26.dll`:...

Global site tag (gtag.js) - Google Analytics