溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python與C++的速度有哪些區(qū)別

發(fā)布時(shí)間:2021-10-20 10:29:02 來源:億速云 閱讀:212 作者:iii 欄目:編程語言

這篇文章主要講解了“Python與C++的速度有哪些區(qū)別”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python與C++的速度有哪些區(qū)別”吧!

DNA K-mers簡(jiǎn)介

DNA是一種稱為核苷酸的長(zhǎng)鏈單位。在DNA中,共有4種核苷酸類型,分別用字母A、C、G和T表示。人類(更準(zhǔn)確地說是智人)擁有核苷酸對(duì)30億個(gè)。例如,人類DNA的一小部分可能類似于:

ACTAGGGATCATGAAGATAATGTTGGTGTTTGTATGGTTTTCAGACAATT

在此示例中,如果從該字符串中選擇任意4個(gè)連續(xù)的核苷酸(即字母),它將是一個(gè)長(zhǎng)度為4的k-mer(可稱之為4-mer)。以下便是從此示例中衍生出來的一些4-mers例子:ACTA,CTAG,TAGG,AGGG,GGGA等。

難點(diǎn)挑戰(zhàn)

本文以生成所有可能的13-mers為例,從數(shù)學(xué)上講,這是一個(gè)帶有替換的排列問題。因此,共有4¹³個(gè)(67108864)可能的13-mers。下面將使用一個(gè)簡(jiǎn)單的算法在C++和Python中生成結(jié)果。

方案比較

為了方便比較C++和Python在此特定挑戰(zhàn)中的優(yōu)劣,我在兩種語言中使用了完全相同的算法。這兩種代碼均有意設(shè)計(jì)地簡(jiǎn)單而相似。同時(shí),避免使用復(fù)雜的數(shù)據(jù)結(jié)構(gòu)或第三方包或庫。第一段代碼采用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!")

運(yùn)行Python代碼,生成全部13-mers共6700萬個(gè)大約需要61.23秒。為了公平比較,我注釋掉了顯示k-mers的行。如果想在生成k-mers時(shí)顯示它們,也可以取消對(duì)這兩行的注釋。注意,顯示全部k-mers耗時(shí)很長(zhǎng)。如有需要,請(qǐng)操作CTRL+C中止代碼。

現(xiàn)在,來看看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;            }

編譯后,運(yùn)行C++代碼,生成全部13-mers共6700萬個(gè)大約需要2.42秒。這意味著運(yùn)行相同算法,Python用時(shí)是C++的25倍多。然后,對(duì)14-mers和15-mers重復(fù)進(jìn)行此實(shí)驗(yàn)。匯總結(jié)果如下表所示:

Python與C++的速度有哪些區(qū)別

比較生成13-、14-和15-mers的Python和C++運(yùn)行結(jié)果。

顯然,C++比Python快得多。對(duì)于大多數(shù)程序員和數(shù)據(jù)科學(xué)家而言,這是共識(shí)。但該示例表明,這種差異十分顯著。

本示例并沒有使用CPU或GPU并行化,因其必須針對(duì)相應(yīng)類型的問題(密集并行難題)進(jìn)行。此外,示例也沒有大量涉及內(nèi)存。如果將運(yùn)行結(jié)果進(jìn)行存儲(chǔ)(出于某些特定原因),那么使用內(nèi)存管理在運(yùn)行C++和Python時(shí),將產(chǎn)生更顯著的差異。

此示例和數(shù)以千計(jì)的其他事實(shí)表明,在處理大量數(shù)據(jù)或指數(shù)增長(zhǎng)的過程中,身為數(shù)據(jù)科學(xué)家,你應(yīng)該了解C++類語言。

感謝各位的閱讀,以上就是“Python與C++的速度有哪些區(qū)別”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Python與C++的速度有哪些區(qū)別這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI