与 Python 相比,C++速度有多快?

Posted AI职通车

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与 Python 相比,C++速度有多快?相关的知识,希望对你有一定的参考价值。

译者:ss3b3、成语风、Born alone°

来源:AI研习社


大概有着数百万个理由钟情于Python(特别对于数据科学家来说)。但是Python和像C/C++这种更为贴近底层的编程语言有多少不同呢?我猜不论是数据科学家们还是Python的用户都想知道答案。Python和以C++为代表的其他底层语言有着很多不同点。在这篇文章中,我将会通过一个特别简单的例子展示与Python相比,C++的速度有多快。

与 Python 相比,C++速度有多快?为了真实地展示差异性,我决定进行一个简单且实用的任务,而不是一个虚构的任务。在这个任务中我将要完成的是对于一个固定的值“k”产生所有DNA k-mers的可能。如果你对DNA k-mers一无所知,我在下一章节用尽可能简单直白的语言解释了它。选择这个例子的原因是许多基因相关的数据处理和分析任务(例如 k-mers generation)被认为是计算密集型任务。这是也是很多在生物信息学领域的数据科学家对C++十分感兴趣的原因(在除了Python之外)。

与 Python 相比,C++速度有多快?


DNA  K-mers 简介 

DNA 是一个被称为核苷酸的长链单位。在 DNA 中,有4种以字母 A、C、G 和 t 表示的核苷酸。人类(或者更准确地说,智人)有30亿个核苷酸对。例如,人类 DNA 的一小部分可能是这样  

ACTAGGGATCATGAAGATAATGTTGGTGTTTGTATGGTTTTCAGACAATT

在这个例子中,如果你从这个字符串中选择任意4个连续的核苷酸(即字母),它将是长度为4的 k-mer (我们称之为4- mer )。这里有一些4- mers 的例子是从这个例子衍生出来的。  

ACTA, CTAG, TAGG, AGGG, GGGA, etc.


所面临的挑战

对于本文,我们将生成所有可能的13-mers。在数学上,它是一个置换问题的置换问题。因此,我们有4¹³(=67,108,864)可能的13-mers。我使用一个简单的算法在 C++ 和 Python 中生成结果。让我们来看看解决方案并进行比较。


比较方案

为了比较 C++ 和 Python 对于这个特定挑战的容易程度,我对这两种语言使用了完全相同的算法。这两种代码都被故意设计得简单和相似。我避免使用复杂的数据结构或第三方包或库。第一个代码是用 Python 编写的。
与 Python 相比,C++速度有多快?
如果运行 Python 代码,生成全部6700万个13- mers 将花费61.23秒。为了进行公平的比较,我注释掉了显示 k-mers 的行(第25和37行)。如果您希望在生成 k-mers 时显示它们,那么您可以取消对这两行代码的注释。注意:需要很长时间才能全部显示。如果需要,请使用 CTRL+C 取消代码。  
现在,让我们看一下 C++ 中的相同算法。  
与 Python 相比,C++速度有多快?
编译后,如果运行代码,则大约需要2.42秒来生成全部6700万个13-mers。这意味着 Python 要比 C++ 多花25倍的时间来运行相同的算法。我对14个 mers 和15个 mers 重复了这个实验(您需要更改 Python 代码中的第12行和 C++ 代码中的第22行)。表1总结了结果。  
  
    
    
  
#include <string> using namespace std; char convert(char c) { if (c == 'A') return 'C'; if (c == 'C') return 'G'; if (c == 'G') return 'T'; if (c == 'T') return 'A'; return ' '; } int main() { cout << "Start" << endl; string opt = "ACGT"; string s = ""; string s_last = ""; int len_str = 13; bool change_next; for (int i=0; i<len_str; i++) { s += opt[0]; } for (int i=0; i<len_str; i++) { s_last += opt.back(); } int pos = 0; int counter = 1; while (s != s_last) { counter ++; // You can uncomment the next line to see all k-mers. // cout << s << endl; change_next = true; for (int i=0; i<len_str; i++) { if (change_next) { if (s[i] == opt.back()) { s[i] = convert(s[i]); change_next = true; } else { s[i] = convert(s[i]); break; } } } } // You can uncomment the next line to see all k-mers. // cout << s << endl; cout << "Number of generated k-mers: " << counter << endl; cout << "Finish!" << endl; return 0; }
表1)比较 Python 和 C++ 生成13-、14-和15- mers 的运行时。  
明显,C++比Python快得多。这对于大多数编程员和数据科学家而言倒不算惊讶, 但是上面这个例子展示了差距有多么大。记住在这个例子里面我们没有用到CPU或者GPU的并行计算,实际上这类问题肯定是要用到这个的。而且我们也没有耗掉大量的内存。如果因为这样或者那样的原因需要把结果存储起来的话,在内存管理上C++和Python的运行时差距还会进一步拉大。
这个例子和数以千计的别的挑战暗示我们即便是数据科学家也应该知道C++之类的语言,假如他们想要在大量的数据和指数增长的进程中生存下来的话。


 
   
   
 
  
    
    
  

投稿、转载、媒介合作联系微信号 | bajiaojiao-sz
商务合作联系微信号 | LJ18825253481

以上是关于与 Python 相比,C++速度有多快?的主要内容,如果未能解决你的问题,请参考以下文章

与锁相比,原子/互锁变量有多快,无论是不是存在争用? [复制]

完成 c++ 文件的速度有多快? [复制]

Wi-Fi 6模块与5G相比有多快?

Python 中将 3 通道 rgb 彩色图像更改为 1 通道灰色的速度有多快?

犯罪分子利用易受攻击 Docker 镜像的速度有多快?

暴力破解 PBKDF2 的速度有多快?