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

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

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

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

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

[[376429]]

为了说明这种区别,本文选择一个简单实用而非想象虚构的任务:生成固定值为“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编写。

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

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

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

#include<iostream> 
           #include<string> 
             usingnamespacestd; 
             charconvert(char c) 
           { 
              if (c == 'A') return'C'; 
              if (c == 'C') return'G'; 
              if (c == 'G') return'T'; 
              if (c == 'T') return'A'; 
              return' '; 
           } 
             intmain() 
           { 
              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 canuncomment 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 tosee all k-mers. 
              // cout << s << endl
              cout << "Number of generated k-mers: " <<counter << endl
              cout << "Finish!" << endl
              return0; 
           } 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.

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

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

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

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

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

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

 

责任编辑:赵宁宁 来源: 今日头条
相关推荐

2018-10-18 09:41:41

2022-09-09 07:41:35

DatabricksSnowflake数据

2024-12-11 16:00:00

C++函数编译器

2021-08-27 08:51:47

MyISAMInnoDB索引

2013-01-08 10:02:26

虚拟化云计算

2013-01-06 09:55:36

虚拟化云计算

2011-08-25 12:51:02

2009-03-13 08:56:31

Symbian手机OS诺基亚

2024-01-15 07:14:37

kubernetesk8sLTS

2012-07-23 10:19:08

微软Azure云计算

2020-10-21 10:48:11

5G网络技术

2021-02-23 19:29:57

智能网卡SmartNIC网络

2015-10-14 17:54:01

容器虚拟机云服务

2023-09-07 09:46:44

程序员编程

2012-01-11 10:14:58

HTML 5

2013-11-27 11:12:12

5G4G第五代移动通信

2020-02-24 17:53:06

5G速度有多快

2017-03-09 15:01:41

混合云企业好处

2012-11-12 10:38:45

BYODVPN

2019-02-22 08:32:21

IPv6互联网IPv4
点赞
收藏

51CTO技术栈公众号