如何使Python代碼運(yùn)行起來速度飛快?
譯文【51CTO.com快譯】Python是開發(fā)人員當(dāng)中流行的編程語言之一。它應(yīng)用廣泛,無論是Web開發(fā)還是機(jī)器學(xué)習(xí)。Python大受歡迎的原因有很多,比如社區(qū)支持、出色的庫(kù)、廣泛用于機(jī)器學(xué)習(xí)和大數(shù)據(jù)以及簡(jiǎn)單的語法。
盡管有這么多優(yōu)點(diǎn),Python還是有一個(gè)缺點(diǎn):速度慢。作為一種解釋性語言,Python的速度不如其他編程語言。不過,我們可以用幾個(gè)技巧來克服這個(gè)問題。
本文將分享幾個(gè)Python技巧,我們可以用來使Python代碼運(yùn)行得比平時(shí)更快。
1. 合適的算法和數(shù)據(jù)結(jié)構(gòu)
每個(gè)數(shù)據(jù)結(jié)構(gòu)對(duì)運(yùn)行時(shí)間都有顯著影響。Python有很多內(nèi)置的數(shù)據(jù)結(jié)構(gòu),比如列表、元組、集和字典等。大多數(shù)人在所有情況下都使用列表數(shù)據(jù)結(jié)構(gòu)。
在Python中,集和字典擁有O(1)查詢性能,因?yàn)樗鼈兪褂霉1怼T谝韵虑闆r下,您可以使用集和字典而不是列表:
- 您在集合中沒有重復(fù)項(xiàng)。
- 您需要在集合中重復(fù)搜索項(xiàng)。
- 集合含有大量項(xiàng)。
您可以在這里看到Python中不同數(shù)據(jù)結(jié)構(gòu)的時(shí)間復(fù)雜度:https://wiki.python.org/moin/TimeComplexity。
該頁(yè)記錄了目前CPython中各種操作的時(shí)間復(fù)雜度(又名“Big O”或“Big Oh”)。
2. 使用內(nèi)置函數(shù)和庫(kù)
Python的內(nèi)置函數(shù)是加速代碼的最佳方式之一。您必須在需要時(shí)使用內(nèi)置的Python函數(shù)。這些內(nèi)置函數(shù)經(jīng)過了充分測(cè)試和優(yōu)化。
這些內(nèi)置函數(shù)之所以很快,是由于Python的內(nèi)置函數(shù)(比如min、max、all和map等)都是用C語言實(shí)現(xiàn)的。
您應(yīng)該使用這些內(nèi)置函數(shù),而不是手動(dòng)編寫有助于更快執(zhí)行代碼的函數(shù)。
例子:
- newlist = []
- for word in wordlist:
- newlist.append(word.upper())
編寫該代碼的一種更好的方式是:
- newlist = map(str.upper, wordlist)
這里我們使用內(nèi)置的map函數(shù),它是用C編寫的。因此,它比使用循環(huán)要快得多。
3. 使用多個(gè)賦值
如果您想為多個(gè)變量賦值,不要逐行賦值。Python有一種優(yōu)雅且更好的方式為多個(gè)變量賦值。
例子:
- firstName = "John"
- lastName = "Henry"
- city = "Manchester"
為這些變量賦值的一種更好的方式如下:
- firstName, lastName, city = "John", "Henry", "Manchester"
變量的這種賦值比上一種賦值簡(jiǎn)潔且優(yōu)雅得多。
4. 偏愛列表推導(dǎo)而非循環(huán)
列表推導(dǎo)是一種優(yōu)雅且更好的方式,只需一行代碼即可基于現(xiàn)有列表的元素創(chuàng)建新列表。
與定義一個(gè)空列表并為該空列表添加元素相比,列表推導(dǎo)是一種更具Python特色的創(chuàng)建新列表的方式。
列表推導(dǎo)的另一個(gè)優(yōu)點(diǎn)是,它比使用append方法為Python 列表添加元素更快。
例子:
- newlist = []
- for i in range(1, 100):
- if i % 2 == 0:
- newlist.append(i**2)
使用列表推導(dǎo)的一種更好的方式:
- newlist = [i**2 for i in range(1, 100) if i%2==0]
如果使用列表推導(dǎo),代碼看起來更簡(jiǎn)潔。
5. 適當(dāng)?shù)膶?dǎo)入
您應(yīng)該避免導(dǎo)入不必要的模塊和庫(kù),除非需要它們??梢灾付K名稱而不是導(dǎo)入完整的庫(kù)。
導(dǎo)入不必要的庫(kù)會(huì)導(dǎo)致代碼性能下降。
例子:
假設(shè)您需要求一個(gè)數(shù)的平方根。別用這個(gè):
- import math
- value = math.sqrt(50)
而是用這個(gè):
- from math import sqrt
- value = sqrt(50)
6. 字符串連接
在Python中,我們使用“+”運(yùn)算符連接字符串。但是在Python中連接字符串的另一種方式是使用join方法。
join方法是一種更具Python特色的連接字符串的方式,它也比使用“+”運(yùn)算符連接字符串更快。
join() 方法更快的原因是,“+”運(yùn)算符創(chuàng)建一個(gè)新字符串,然后在每一步復(fù)制舊字符串,而join() 方法不是這么工作的。
例子:
- output = "Programming" + "is" + "fun
使用join方法:
- output = " ".join(["Programming" , "is", "fun"])
這兩種方法的輸出一樣。唯一的區(qū)別是,join()方法比“+”運(yùn)算符快。
結(jié)束語
這就是本文的全部?jī)?nèi)容。本文討論了可用于加快代碼運(yùn)行速度的幾個(gè)技巧。這些技巧尤其適用于爭(zhēng)分奪秒的競(jìng)賽型編程。
原文標(biāo)題:How to Make Python Code Run Incredibly Fast,作者:Pralabh Saxena
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】