与Python的速度较量:C++究竟有多快?_世界热讯
(资料图)
图源:unsplash
对于数据科学家而言,热爱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编写。
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]): s = s[:i] +convert(s[i]) + s[i+1:] change_next =True else: s = 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!")
运行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; }
编译后,运行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++类语言。
留言点赞关注
我们一起分享AI学习与发展的干货
如转载,请后台留言,遵守转载规范
关键词:
推荐阅读
核废水介绍 核废水对生态环境有哪些危害?
核废水介绍核废水由核电站产生。听起来是不是很高端,其实发电的原理和火电厂是一样的,只是一个是烧煤,一个是烧核。水烧开后,用蒸汽驱动 【详细】
阿波罗11号未解之谜 阿波罗11号登月证据是什么?
阿波罗11号未解之谜1969年7月16日,巨大的土星5号火箭载着阿波罗11号飞船从美国卡纳维拉尔角肯尼迪航天中心点火升空,开始了人类首次登月的 【详细】
大数据有什么用?大数据技术的应用领域介绍
大数据有什么用?大数据指的是在一定时间范围内不能被传统软件工具捕获、管理和处理的数据集。它是一种海量、高增长和多样化的信息资产,需 【详细】
验钞机什么牌子好?验钞机的价格介绍
验钞机什么牌子好?康艺康艺始于1994年。是行业标准的起草单位,其产品人民币外币柜台 清分机 复点机 捆钞机 扎把机 取款箱是研发康艺专业生 【详细】
苹果秋季发布会正式官宣 iPhone 12系列手机有什么型号?
苹果秋季发布会正式官宣昨晚,苹果正式宣布了秋季发布会的时间,线上会议将于9月16日凌晨1点举行。这也是今年在苹果举行的第二次线上会议, 【详细】
相关新闻
- 与Python的速度较量:C++究竟有多快?_世界热讯
- 恒创科技:有些香港云主机为啥更容易遭遇停机风险?
- 天天速读:比亚迪六棱柱电池 是特斯拉4680电池的真正对手吗?
- T/R芯片龙头铖昌科技:6年营收累计增长11.51倍,地面及卫星互联网领域产品形成新的利润增长点_视焦点讯
- "印度支付宝"有多扶不上墙?曾坐拥3亿用户,却惨遭阿里抛售|世界热文
- 视点!医院导管室是干什么的(导管室开展新技术的目的)
- 中信建投:港股迎来年内最佳机会|环球快播
- 俄外交部:废止《欧洲常规武装力量条约》法律正式生效_今头条
- 索尼发布 FX6 和 CineAltaV 2 电影机固件升级预告,强化拍摄性能_热推荐
- 中国运载火箭落区控制技术进一步突破 落点更加精确_世界观天下
- 世界最新:如何预防溺水300字(如何预防溺水)
- 环球最资讯丨首届西部职教基地运动会在永川开幕
- 香港金管局总裁余伟文:继续与内地监管部门研究推出离岸国债期货
- 日本人把安卓手机做成了翻盖的,而且你100多元就能买到
- 当前讯息:颗粒捕捉器是燃油车永远的痛,“摘口罩”是不可能了!
- 环球精选!光速下时间会停止,是不是坐在光速飞船里的人就不会老了?
- 当前简讯:拿刀切物体的时候,到底切开了什么?难道是将原子切碎了吗?
- 合肥芯片黑马,三年估值数十亿-全球热消息
- 六和敬原文_六和敬
- 辅音字母和元音字母区别_辅音字母和元音字母|全球观天下