与Python的速度较量:C++究竟有多快?

本文转载自公众号“读芯术”(ID:AI_Discovery)。

创新互联是一家集网站建设,许昌企业网站建设,许昌品牌网站建设,网站定制,许昌网站建设报价,网络营销,网络优化,许昌网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

对于数据科学家而言,热爱Python的理由数不胜数。但你是否也曾问过这样的问题:Python和C或C++等更专业的低级编程语言究竟有何不同呢?我想这是很多数据科学家或者Python用户曾经问过或者将来会问自己的问题。

Python和C++类语言之间存在许多区别,本文将通过一个十分简单的例子向你展示,与Python相比,C++究竟有多快。

为了说明这种区别,本文选择一个简单实用而非想象虚构的任务:生成固定值为“k”的所有可能DNA k-mers。选择该示例,是因为与基因组相关的许多数据处理和任务分析(例如k-mers生成)都是计算密集型的,而这同样也是很多生物信息学领域的数据科学家对C++感兴趣的原因。

请注意,本文目标并不是以最有效的方式比较C++和Python。这两种代码均可采用更高效的方式和更优化的方法编写。本文的唯一目标,就是比较这两种语言在使用完全相同的算法和指令时的速度。

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等。

难点挑战

本文以生成所有可能的13-mers为例,从数学上讲,这是一个带有替换的排列问题。因此,共有4¹³个(67108864)可能的13-mers。下面将使用一个简单的算法在C++和Python中生成结果。

方案比较

为了方便比较C++和Python在此特定挑战中的优劣,我在两种语言中使用了完全相同的算法。这两种代码均有意设计地简单而相似。同时,避免使用复杂的数据结构或第三方包或库。第一段代码采用Python编写。

 
 
 
 
  1. defconvert(c):
  2.                if (c =='A'): return'C'
  3.                if (c =='C'): return'G'
  4.                if (c =='G'): return'T'
  5.                if (c =='T'): return'A'
  6.              print("Start")
  7.              opt ="ACGT"
  8.             s =""
  9.             s_last =""
  10.             len_str =13
  11.              for i inrange(len_str):
  12.                s += opt[0]
  13.              for i inrange(len_str):
  14.                s_last += opt[-1]
  15.              pos =0
  16.             counter =1
  17.             while (s != s_last):
  18.                counter +=1
  19.                # You can uncomment the next line to see all k-mers.
  20.                # print(s)
  21.                change_next =True
  22.                for i inrange(len_str):
  23.                     if (change_next):
  24.                         if (s[i] == opt[-1]):
  25.                             ss = s[:i] +convert(s[i]) + s[i+1:]
  26.                             change_next =True
  27.                         else:
  28.                             ss = s[:i] +convert(s[i]) + s[i+1:]
  29.                             break
  30.              # You canuncomment the next line to see all k-mers.
  31.             # print(s)
  32.             print("Number ofgenerated k-mers: {}".format(counter))
  33.             print("Finish!")

运行Python代码,生成全部13-mers共6700万个大约需要61.23秒。为了公平比较,我注释掉了显示k-mers的行。如果想在生成k-mers时显示它们,也可以取消对这两行的注释。注意,显示全部k-mers耗时很长。如有需要,请操作CTRL+C中止代码。

现在,来看看C++中同样的算法:

 
 
 
 
  1. #include
  2.            #include
  3.              usingnamespacestd;
  4.              charconvert(char c)
  5.            {
  6.               if (c == 'A') return'C';
  7.               if (c == 'C') return'G';
  8.               if (c == 'G') return'T';
  9.               if (c == 'T') return'A';
  10.               return' ';
  11.            }
  12.              intmain()
  13.            {
  14.               cout << "Start" << endl;
  15.                  string opt = "ACGT";
  16.               string s = "";
  17.               string s_last = "";
  18.               int len_str = 13;
  19.               bool change_next;
  20.                  for (int i=0; i
  21.               {
  22.                    s += opt[0];
  23.               }
  24.                  for (int i=0; i
  25.               {
  26.                    s_last += opt.back();
  27.               }
  28.                  int pos = 0;
  29.               int counter = 1;
  30.               while (s != s_last)
  31.               {  
  32.                    counter ++;
  33.                    // You canuncomment the next line to see all k-mers.
  34.                    // cout << s<< endl; 
  35.                    change_next = true;
  36.                    for (int i=0; i
  37.                    {
  38.                        if (change_next)
  39.                        {
  40.                            if (s[i] == opt.back())
  41.                            {
  42.                                s[i] = convert(s[i]);
  43.                                change_next = true;
  44.                            } else {
  45.                                s[i] = convert(s[i]);
  46.                                break;
  47.                            }
  48.                        }
  49.                    }
  50.               }
  51.                  // You can uncomment the next line tosee all k-mers.
  52.               // cout << s << endl;
  53.               cout << "Number of generated k-mers: " <
  54.               cout << "Finish!" << endl;
  55.               return0;
  56.            }

编译后,运行C++代码,生成全部13-mers共6700万个大约需要2.42秒。这意味着运行相同算法,Python用时是C++的25倍多。然后,对14-mers和15-mers重复进行此实验。汇总结果如下表所示:

比较生成13-、14-和15-mers的Python和C++运行结果。

显然,C++比Python快得多。对于大多数程序员和数据科学家而言,这是共识。但该示例表明,这种差异十分显著。

本示例并没有使用CPU或GPU并行化,因其必须针对相应类型的问题(密集并行难题)进行。此外,示例也没有大量涉及内存。如果将运行结果进行存储(出于某些特定原因),那么使用内存管理在运行C++和Python时,将产生更显著的差异。

此示例和数以千计的其他事实表明,在处理大量数据或指数增长的过程中,身为数据科学家,你应该了解C++类语言。

新闻标题:与Python的速度较量:C++究竟有多快?
浏览路径:http://www.shufengxianlan.com/qtweb/news40/22940.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联