python web开发速度怎么样_与Python的速度较量:C++究竟有多快?

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

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

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

7c7783fae30d1b0d6f986207ca3b86b1.png

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

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

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

#include

#include

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 <

string opt="ACGT";

string s="";

string s_last="";

int len_str=13;

bool change_next;

for (int i=0; i

{

s += opt[0];

}

for (int i=0; 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 <

change_next=true;

for (int i=0; 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 <

cout <

cout <

return0;

}

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

2eebd7b9af17b88ca005674d5bdff6da.png

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

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

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

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

04e9d836fd7f18c4e2d83baac7f351b0.png

【责任编辑:赵宁宁 TEL:(010)68476606】

de3ddabfe1b9ced3cf097bd00bf5bd28.png

扫描关注:"WEB开发者网“公众号,分享WEB开发知识,让开发变得更简单!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值