當前位置:
首頁 > 最新 > 為什麼Python是AI從業者的首選語言?

為什麼Python是AI從業者的首選語言?

源小象文李燁

Python語言從1991年發布第一個版本,至今已經快30年了。作為一種解釋型語言,很多年裡一直打著「腳本語言」的標籤,並因為運行速度被詬病。

但是現在,如果你想從事人工智慧行業的技術工作,學習Python已然成為了必須。

根據數據平台 Kaggle發布的2017年機器學習及數據科學調查報告,在工具語言使用方面,Python是數據科學家和人工智慧從業者使用最多的語言(見下圖)。

IEEE綜覽(IEEE Spectrum)發布的2017最受歡迎編程語言列表中,Python同樣位列第一(見下圖)。

筆者並不是Python粉,做了十幾年程序員,工作語言最開始是C,後來用Java,現在用C#。

卻也不得不承認,在日常工作中,Python所佔的比例越來越大了。

即使不是開發最終提供給用戶的產品,做POC或Prototype會用到Python;處理數據會用到Python;驗證論文也會用Python……

毋庸置疑,Python已經成為了AI從業者的首選。

曾經被認為是「學生才用」的Python,為什麼頂尖的大公司都在用?為什麼Python忽然之間變得這麼招人愛?

究其原因,筆者認為,大概有以下幾個:

I. Python是一種說人話的語言

解釋一下,所謂「說人話」,是指這種語言:

我們先來看幾個代碼的例子:

C 語言Hello World 代碼:

intmain()

{

printf("Hello, World!");

return;

}

Java 語言Hello World 代碼:

Python 語言Hello World代碼:

print("Hello World!")

僅僅是一個Hello World程序,就能看出區別了,是不是?

編譯 VS 解釋

當然,僅僅是一個Hello World的話,C和Java的代碼也多不了幾行。

可是不要忘了,C和Java的代碼要運行,都必須先經過編譯的環節。

對於C語言來說,在不同的操作系統上使用什麼樣的編譯器,也是一個需要斟酌的問題。一旦代碼被copy到新的機器,運行環境和之前不同,還需要重新編譯,而那台機器上有沒有編譯器還是一個問題,安裝上編譯器後,也許和之前最初的編譯器有所區別,還得修改源代碼來滿足編譯環境的需求……

我到底做錯了什麼?我只是想運行一個別人寫的程序而已[淚目]

而Python則不用編譯,直接運行。而且都可以不用寫文件,一條條語句可以直接作為命令行運行。不要太方便咯。

我們來看一個實際一點的例子:創建一個鏈表,把0-9逐次插入到鏈表中。再從head開始逐一列印鏈表中每個節點的值。

這樣一個程序,看看用C,Java和Python分別如何實現:

【創建列印鏈表 - C代碼】:

structlist_struct

{

intval;

structlist_struct*next;

};

struct list_struct*create_list(intval)

{

structlist_struct*head=NULL;

structlist_struct*ptr= (structlist_struct*)malloc(sizeof(structlist_struct));

if(NULL== ptr)

{

printf("
Node creation failed
");

returnNULL;

}

ptr->val = val;

ptr->next =NULL;

head = ptr;

returnhead;

}

struct list_struct*add_to_list(list_struct* curr,intval)

{

if(curr =NULL)

{

printf("
Node insertion failed
");

returnNULL;

}

structlist_struct*ptr= (structlist_struct*)malloc(sizeof(structlist_struct));

if(NULL== ptr)

{

printf("
Node creation failed
");

returnNULL;

}

ptr->val = val;

ptr->next =NULL;

curr->next = prt;

returnptr;

}

voidprint_list(list_struct* head)

{

structlist_struct*ptr=head;

while(ptr !=NULL)

{

printf("
[%d]
",ptr->val);

ptr = ptr->next;

}

return;

}

intdelete_list(list_struct* head)

{

structlist_struct*curr=head;

structlist_strcut*del=NULL;

if(head==NULL)

{

return-1;

}

else

{

while(curr->next !=NULL)

{

del = curr;

curr = curr->next;

free(del);

}

free(curr);

}

return;

}

intmain(void)

{

inti =, ret =;

structlist_struct*head=create_list(0);

structlist_struct*prt=head;

for(i =1; i

prt = add_to_list(prt,i);

print_list(head);

delete_list(head);

return;

}

【創建列印鏈表 - Java代碼】:

【創建列印鏈表 - Python代碼】:

numbers =list(range(10))

print(numbers)

這個時候是不是已經看出區別來了?

底層細節

請注意C代碼中的malloc()free()函數。它們在幹嘛?它們在操作內存。

malloc()為鏈表的單元申請一塊內存,free()釋放掉它。如果申請了的內存空間沒有被釋放掉,就會產生著名的內存泄漏。

允許開發者(程序員)直接掌控底層細節,是C的閃光點,是有相應需求程序的利器,是其高性能的保障。但對於不需要也沒有興趣成為「語言大師」的用戶,幾乎就是災難。

Java和Python都有自動垃圾回收機制,能夠自動管理內存。再也不用手動分配和回收內存空間了!

變數類型

Java和Python都是誕生在上世紀90年代初期,有許多相似之處。但也有很多不同。

Java是靜態類型語言,一個變數一旦被指定了一個類型,就不再接受其他類型的值。

例如上面例子中的List numbers = new ArrayList(); numbers既然已經被聲明為每個element都是Integer類型,就不能接受其他(例如String)類型的值。

動態類型語言Python就不受這個限制。下面的代碼一樣可以運行:

numbers =list(range(10))

numbers.append("test")

print(numbers)

列印結果是:

[,1,2,3,4,5,6,7,8,9, "test"]

當然,靜態類型 vs 動態類型各有其適用域,並不是說動態就一定比靜態好。

不過,寫AI相關的程序時,處理大量非結構化數據是必然要求。針對這一場景,動態類型自有其可以施展的地方。

語言語法

和Python比,Java的語法更「啰嗦」。

從上面的例子已經可以看出,創建一個鏈表,Java還需要聲明和逐個插入節點,而Python則可一行代碼完成從鏈表創建到插入節點及賦值的全部操作。

這還只是一個例子。在真正的使用中就會發現,對於很多非常簡單基礎的操作,Java非讓你很彆扭地寫好幾行,Python直接一句搞定。

這樣的結果就是,Python寫起來省事,讀起來也方便。可讀性遠超Java。

表達風格

在10年或者更久遠之前,Python經常被用來和Perl相提並論。畢竟在那個時候,C是系統級語言,Java是面向對象語言,而Python & Perl則是腳本語言的雙子星。

Python和Perl在設計層面有一個非常大的區別:

從哲學層面講,Perl的追求更加自由主義,更利於釋放人類的多樣化天性。也確實有很多Geek范兒程序員因為這一點推崇毫無限制的Perl,鄙視到處設限的Python。

然而,Perl寫的程序——那叫一個亂七八糟!

當你想遇到問題,想在網上找點實例代碼看看的時候,搜到的Perl example千姿百態,很難找到一種「大眾」的解法。而不同寫法之間,還很難保證相容。

這個問題其實在Python vs Java上也有,只不過程度要低得多。

Java語言本身並沒有想要把自己變成書寫代碼詩歌的載體。但是因為它長年大量地被應用在企業級軟體的後台開發,夾雜進了太多並非語言本身卻又與其使用不可分割的東西,進一步加劇了Java的繁雜。

如果不是想成為代碼詩人,或者語言大師,只是想用盡量簡單直接的方法,把事情做了,首選語言確實是Python。

II. 強大的AI支持庫

由於Python語言自身所具備的特性,使得它成了做數據處理、機器學習和深度學習的人們的首選。

畢竟這些領域早期的主體是研究人員和數據科學家。他們並不是職業程序員,編程語言本身與他們而言僅僅是一種工具。

他們沒有興趣搞什麼「XXX是最好的編程語言」,也不想陷入語言類型、特徵的爭論,僅僅是需要一種能夠在付出最小學習代價的前提下,儘快將他們的想法實現為代碼的載體。

如此一來,Python就成了他們的掌中寶。作為回報,他們向Python反哺了大量用於數據處理和機器學習的支持庫。

其中最著名的NumPy和sklearn(scikit-learn),它們是現在每一個有志於入行AI的人都不可能忽略的。

矩陣運算

NumPy由數據科學家Travis Oliphant創作,支持維度數組與矩陣運算。結合Python內置的math和random庫,堪稱AI數據神器!有了它們,就可以放心大膽玩矩陣了!

大家知道,不管是Machine Learning,還是Deep Learning,模型、演算法、網路結構都可以用現成的,但數據是要自己負責I/O並傳遞給演算法的。

而各種演算法,實際上處理的都是矩陣和向量。

使用NumPy,矩陣的轉置、求逆、求和、叉乘、點乘……都可以輕鬆地用一行代碼搞定,行、列可以輕易抽取,矩陣分解也不過是幾行代碼的問題。

而且,NumPy在實現層對矩陣運算做了大量的並行化處理,通過數學運算的精巧,而不是讓用戶自己寫多線程程序,來提升程序效率。

有了Python這種:語法簡潔明了、風格統一;不需要關注底層實現;連矩陣元素都可以像在紙上寫公式一樣;寫完公式還能自動計算出結果的編程語言,開發者就可以把工作重心放在模型和演算法上了。

ML模型

用Python實現大多數經典模型,幾十上百行代碼就夠了。

當然,對於普通用戶,也可以連演算法都不用管,只是調用Scikit-Learn的介面就可以了。

比如,訓練和使用一個logistic Regression模型,只需要下面幾行代碼就可以了:

#import the LogisticRegression

from sklearn.linear_model import LogisticRegression

#Use default parameters

classifier = LogisticRegression()

#train model

classifier.fit(train_set, target)

#dotest

y_hat = classifier.predict(test_set)

#printouttestresults

print y_hat

支持圖表

Python還有許多圖標方面的支持庫。用來生成dashboard上的各種圖形表格,是非常簡單的事情。

比如使用Plotly圖形庫,下面這些炫彩的圖形,就隨便用啦:

III. 規模效應

語言簡單易學,支持庫豐富強大,這兩大支柱從早期就奠定了Python的江湖地位。

不過當然咯,羅馬不是一天建成的,凡事都需要積累。雖然NumPy的前身在1995年就出現了,不過正式的NumPy卻是到了2006年才發布。sklearn則發佈於2007年。

根據以高收入國家Stack Overflow問題閱讀量為基礎的主要編程語言趨勢統計,可以看出,近年來,Python已然力壓Java和Javascript,成為目前發達國家增長最快的編程語言(見下圖)。

由圖可見,2012年之後,對於Python相關問題的瀏覽量迅速增長,從時間上看,這一趨勢正好和近幾年人工智慧的發展重合。

技術的普及推廣就像滾雪球,早期的積累相對緩慢,一旦過了臨界點,就是大爆發。

別的不說,就說現在tensorflow,caffe之類的深度學習框架,主體都是用Python來實現,提供的原生介面也是Python。

如今,Python在AI領域的老大地位已經奠定。

從現在開始學AI,舍Python其誰?

作者:李燁

現就職於微軟(Microsoft),曾在易安信(EMC)和太陽微系統(Sun Microsystems)任軟體工程師。先後參與聊天機器人、大數據分析平台等項目的開發。微信公眾號:yuesiyuedu

-END-

版權聲明:本文為小象原創文章,轉載請聯繫後台。

近年來國內人工智慧產業持續升溫,對人才的需求量急劇增加,企業也願意提供優厚待遇招聘熟練掌握Python的開發者。如果你打算把Python作為職業提升或轉型的終極武器,下面這門《Python人工智慧》課是你的必修課。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Python3快速排序
Fabric3:Fabric的Python3支持版

TAG:Python |