中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

詳解Python3.8的海象算子:大幅提高程序執(zhí)行效率

2019-12-30    來源:raincent

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

作者: Animesh Gaitonde  來源:機(jī)器之心

前幾個(gè)月發(fā)布的 Python 3.8 包含了一項(xiàng)重要的新功能,即海象算子。如果合理運(yùn)用,該算子能有效地提升 Python 程序的執(zhí)行效率。本文將對海象算子的作用和效果進(jìn)行介紹,并會通過示例演示其使用方法和不適用的場景。本文作者為軟件工程師 Animesh Gaitonde。

 

 

自我開始學(xué)習(xí) Python 以及利用它的能力以來,我就一直是這門編程語言的死忠粉。Python 句法簡單,易于掌握,而且有助于提升代碼庫的可讀性和可維護(hù)性。相比于 C、C++、Java 或 Ruby 等其它高級語言,使用 Python 實(shí)現(xiàn)一個(gè)算法所需的代碼量能少 5 倍之多。

最近,Python 社區(qū)發(fā)布了該語言的 3.8 版本。作為 Python 語法糖的愛好者,我探索了發(fā)布說明,關(guān)注到了其中一個(gè)獨(dú)特的算子。這個(gè)算子被稱為「海象算子(Walrus Operator)」或「命名表達(dá)式算子(Named Expression operator)」,符號為「:=」。

海象算子

這個(gè)新算子(:=)能讓我們?yōu)楸磉_(dá)式中的一個(gè)變量賦值。這個(gè)符號看起來頗有些類似于海象的眼睛和犬齒。

我們先來看看下面一段代碼:

countries = [“India”, “USA”, “France”, “Germany”]if len(countries) < 5:
print ("Length of countries is " + len(countries))

在上面的代碼段中,我們兩次調(diào)用了函數(shù) len()。我們可以避免重復(fù)計(jì)算以提升可讀性嗎?當(dāng)然可以,我們可對這段代碼進(jìn)行如下改進(jìn):

country_size = len(countries)if country_size < 5:
print ("Length of countries is " + country_size)

還有進(jìn)一步改進(jìn)的空間嗎?我們可以不用單獨(dú)一行來給「country_size」賦值嗎?

if country_size := len(countries) < 5 :
print ("Length of countries is " + country_size)

這就是 Python 3.8 引入的海象算子的用武之地。我們可以在 if 語句之中直接執(zhí)行聲明和賦值操作。我們下面進(jìn)一步探索該算子的能力。

代碼行數(shù)與復(fù)雜度的平衡

先看看以下示例

powers = [get_count(), get_count()**2, get_count()**3]
def get_count():
"Fetches count of records from a database"

多次調(diào)用一個(gè)高成本的函數(shù)

上面的示例是通過多次調(diào)用一個(gè)高成本的函數(shù) get_count() 來填充一個(gè)列表。

有了海象算子的幫助,我們可以避免多次調(diào)用函數(shù) get_count(),其具體的功能是將結(jié)果存儲到一個(gè)變量中,然后我們可在后續(xù)的計(jì)算中復(fù)用同一個(gè)變量。下面演示了海象算子的用法:

powers =[result:= get_count(), result**2, result**3]
def get_count():
"Fetches count of records from a database"

使用海象算子避免多次調(diào)用函數(shù)

從上面的例子可以看到,海象算子可以減少代碼行數(shù),讓代碼更可讀,因此能簡化代碼審查人員的工作。此外,這也能實(shí)現(xiàn)代碼行數(shù)和代碼復(fù)雜度的平衡。

解決理解低效的問題

employees = []
for id in employee_ids:
employee = fetch_employee(id)
if employee:
employees.append(employee)

基于一個(gè)條件填充列表

上面的示例需要多次執(zhí)行循環(huán)。一開始,我們創(chuàng)建一個(gè)空列表,然后在 id 列表上迭代并通過檢查結(jié)果是否有效來填充我們創(chuàng)建的列表。

我們可以簡化上面的代碼,將其濃縮為一行:

employees = [result for id in employee_ids if (result:= fetch_employee(id))]

使用海象算子避免低效理解

文件分塊處理

在處理大文件時(shí),我們會將文件分塊讀取。每當(dāng)讀取一個(gè)分塊時(shí),都會檢查它的值,并且該值也是 while 循環(huán)的終止條件。

chunk = file.read(256)
while chunk:
process(chunk)
chunk = file.read(256)

我們可以在 while 循環(huán)表達(dá)式中讀取數(shù)據(jù)以及為要讀取的數(shù)據(jù)賦值。由此我們就能避免在 while 循環(huán)之外顯式地聲明變量。如下示例:

while chunk := file.read(256) :
process(chunk)

正則表達(dá)式匹配

正則表達(dá)式匹配是一個(gè)兩步式過程。第一步是檢查是否有匹配,第二步是提取匹配的部分。

obj = re.match(info).group(1) if re.match(info) else None

正則表達(dá)式匹配

從上面的代碼可以觀察到,我們在一次匹配中重復(fù)計(jì)算了 re.match(info)。這會減慢該程序的執(zhí)行速度,而且數(shù)據(jù)量越大減慢得越明顯。上面的代碼可以重寫為如下形式,從而避免重復(fù)計(jì)算:

obj = match.group(1) if match:= re.match(info) else None

使用 := 的正則表達(dá)式匹配

不能使用海象算子的地方

為變量賦值

a = 5 # 有效
a := 5 # 無效

empty_list = [] # 有效
empty_list := [] # 無效

如上所示,我們不能使用 := 替代 =。海象算子只能是一個(gè)表達(dá)式的一部分。

加法/減法賦值

a += 5 # 有效
a :+=5 # 無效

在 lambda 函數(shù)中為表達(dá)式賦值

(lambda: a:= 5) # 無效
lambda: (a := 5) # 有效但無用
(var := lambda: 5) # 有效

PEP-572 及其爭議

海象算子是作為 PEP-572(Python 改進(jìn)提議)的一部分而引入的。如果要為 Python 語言引入一項(xiàng)新功能,總是需要經(jīng)由 PEP 來實(shí)現(xiàn),而且必須得到 Python 的發(fā)明者 Guido van Rossum 或他選擇的代表的批準(zhǔn)。

圍繞海象算子的爭議非常多,而且由此引發(fā)的「戰(zhàn)爭」導(dǎo)致了 Python 之父 Guido van Rossum 告退,不再擔(dān)任 Python 社區(qū)的終身仁慈獨(dú)裁者(BDFL)。海象算子的爭議點(diǎn)有很多,下面是其中幾個(gè):

句法變化問題:開發(fā)者們?yōu)?:= 提議了多種替代方案,比如「表達(dá)式 -> NAME」、「NAME -> 表達(dá)式」、「{表達(dá)式} NAME」等等。少數(shù)人建議使用現(xiàn)有的關(guān)鍵字,其他人則使用了新的算子。

后向兼容問題:這個(gè)特性無法向后兼容,也無法運(yùn)行在之前的 Python 版本上。

算子名稱問題:人們建議不要使用「海象算子」這樣的代號,而是使用「賦值算子」、「命名表達(dá)式算子」、「成為算子」等術(shù)語,以免人們不明白。

標(biāo)簽: Python

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:Spark 誕生頭十年:Hadoop 由盛轉(zhuǎn)衰,統(tǒng)一數(shù)據(jù)分析大行其道

下一篇:2019 年薪水最高的十三個(gè)技術(shù)崗位