当前位置: 首页 > 科技观察

速度对比Python:C++有多快?

时间:2023-03-18 20:41:04 科技观察

本文转载自公众号《核心阅读》(ID:AI_Discovery)。对于数据科学家来说,热爱Python的理由数不胜数。但是你有没有问过这个问题:Python与C或C++等更专业的低级编程语言有何不同?我认为这是许多数据科学家或Python用户已经问过或将来会问自己的问题。Python和C++之类的语言之间存在许多差异,本文将通过一个非常简单的示例向您展示C++与Python相比有多快。为了说明这种差异,本文选择了一个简单实用的任务而不是虚构的小说:生成所有可能的具有固定“k”值的DNAk-mers。之所以选择这个例子,是因为很多与基因组相关的数据处理和分析任务(比如k-mers生成)都是计算密集型的,这也是很多生物信息学领域的数据科学家对C++感兴趣的原因。请注意,本文的目的不是以最有效的方式比较C++和Python。两种代码都可以以更高效和优化的方式编写。本文的唯一目标是比较这两种语言在使用完全相同的算法和指令时的速度。DNAK-mers简介DNA是一种称为核苷酸的长链单元。在DNA中,有四种类型的核苷酸,分别用字母A、C、G和T表示。人类(更准确地说是智人)拥有30亿个核苷酸对。例如,人类DNA的一小部分可能看起来像:ACTAGGGATCATGAAGATAATGTTGGTGTTTGTATGGTTTTCAGACAATT在这个例子中,如果你从这个字符串中选择任何4个连续的核苷酸(即字母),它将是一个长度为4的k-mer(可以称为4-mer).以下是从这个例子派生出的一些4-mers的例子:ACTA、CTAG、TAGG、AGGG、GGGA等。困难的挑战本文以生成所有可能的13-mers为例,这在数学上是一个带替换的排列问题。因此,总共有4^3(67108864)个可能的13聚体。下面将使用一个简单的算法在C++和Python中生成结果。解决方案比较为了比较C++和Python在应对这一特殊挑战时的优缺点,我在两种语言中使用了完全相同的算法。两种代码都特意简单且相似。此外,避免使用复杂的数据结构或第三方包或库。第一段代码是用Python编写的。defconvert(c):if(c=='A'):return'C'if(c=='C'):return'G'if(c=='G'):return'T'if(c=='T'):return'A'print("Start")opt="ACGT"s=""s_last=""len_str=13foriinrange(len_str):s+=opt[0]foriinrange(len_str):s_last+=opt[-1]pos=0counter=1while(s!=s_last):counter+=1#Youcanuncommentthenextlinetoseeallk-mers.#print(s)change_next=Trueforiinrange(len_str):if(change_next):if(s[i]==opt[-1]):ss=s[:i]+convert(s[i])+s[i+1:]change_next=Trueelse:ss=s[:i]+convert(s[i])+s[i+1:]break#Youcanuncommentthenextlinetoseeallk-mers.#print(s)print("Numberofgeneratedk-mers:{}".format(counter))print("Finish!")运行Python代码生成所有13-mers总共6700万,耗时约61.23秒。为了公平比较,我注释掉了显示k-mers的行。如果你想在生成k-mers时显示它们,你也可以取消注释这两行。请注意,显示所有k-mers需要很长时间。如有必要,可使用CTRL+C中止代码。现在,让我们看看C++中的相同算法:#include#includeusingnamespacestd;charconvert(charc){if(c=='A')return'C';if(c=='C')return'G';if(c=='G')return'T';if(c=='T')return'A';return'';}intmain(){cout<<"开始"<