秦科++劉貴松



摘 要:數據分析與處理是計算機應用面臨的一項重要任務。針對國內大學的程序設計教學與數據分析存在脫節這一現象,分析Python自身的特點和Python計算生態的發展現狀,結合工程項目中的應用經驗,提出面向數據分析的Python程序設計語言教學改革方法并以案例說明。
關鍵詞:Python;教學改革;實驗教學;計算生態
0 引 言
隨著時代的發展,構建在互聯網生態模式之上的云計算、大數據、人工智能等新技術,正滲透到每一個行業,引發產業生產、服務模式的變革,并且已經取得一系列重要成果。在此背景下,大學教學如何跟上時代步伐,是值得每一個高校教師深入思考的問題。程序設計作為計算機專業大學生的必修課程和必須掌握的基本技能,其教學改革在新時代下尤顯必要。
傳統的大學教學中,一直都以C/C++或Java作為教學語言。誠然,C/C++和Java是當今使用人數最多的語言,但在“互聯網+”時代,面對大數據分析時,特別是面對數據采集、仿真建模、結果驗證與數據可視化時,他們就不再是最佳選擇。
Python作為一種解釋型超高級語言,具備交互式、可移植、面向對象的特點。它功能強大,適用于多種操作系統,有完善豐富的工具包,正在得到越來越多的應用,而且越來越被重視。2017年4月,北京理工大學計算機學院和高等教育出版社聯合承辦了“第一屆高等學校Python語言及計算生態教學研討會”,提出了計算生態的概念[1],大力推動了Python教學。在此背景下,根據我們在Python教學和科研中的應用經驗,對如何進行基于Python計算生態的教學改革進行探討。
1 Python語言的興起與優勢
從20世紀中期到今天,短短的70年間,電子計算機經歷了飛速的發展,出現了許多不同的程序設計語言,例如Pascal、Fortran、C、C++、Java、PHP、C#等,這些不同的語言,都體現了不同的設計哲學,也反映了不同的時代特點。
然而,每種程序設計語言都有其局限性。Python的設計者Guido von Rossum希望有一種語言,既具有C方便地調用計算機功能接口的能力,又可以像一些腳本語言一樣輕松地編程。Python正是在這種背景下被創造出來。
同C/C++和Java等語言相比,Python有以下優勢:
(1)簡單易學。Python是一種代表簡單主義思想的語言,語法簡單,學習起來容易上手。這使學生能夠專注于解決問題而不是學習語言本身。
(2)解釋性。Python寫的程序不需要編譯成二進制代碼,可以直接從源代碼運行程序。這使得Python更加簡單,更易于移植。
(3)面向對象。Python既支持面向過程的編程,也支持面向對象的編程。
(4)可擴展性。為了提升運行效率,可以采用C/C++來編寫關鍵代碼,然后在Python程序中使用它們。
(5)混合編程。Python被稱為膠水語言,是由于可以很容易地將Python與其他語言進行混合編程。這樣方便地利用已有的各種工具包,提高開發效率。
(6)豐富的庫。Python有強大的標準庫,并且Python的生態系統開始拓展到第三方包,例如用于Web框架的web.py ,用于科學計算的numpy,以及用于數據可視化的matplotlib等。
Python作為一種跨平臺編程語言,已經被移植在以Linux、Windows、Mac、Android為代表的許多平臺上。由于Python的開放性,有豐富的來自開源社區的成熟庫支持,從而可以基于Python完成各種工作,例如數據采集(如網絡爬蟲)、圖像處理、機器學習、科學計算等。
2 針對Python的應用支持與國內外課程建設情況
正由于Python具有上述優點,它獲得了業界的廣泛支持。例如在Google公司,Python是繼C++和Java之后,使用率排名第三的編程語言,使用Python的開發團隊也是Google的第三大研發部門。
(1)Tensorflow:TensorFlow是由Google Brain小組開發的用于機器學習和深度神經網絡的工具。據統計,Tensorflow是目前使用人數最多的開源深度學習框架[2]。TensorFlow本身是使用C++實現的,然后用Python封裝。Tensorflow可以根據用戶給出的所有指令創建一個計算圖,該圖被內部優化和編譯成可執行的C++代碼。這樣Tensorflow就可以利用Python 帶來的開發速度和C++帶來的執行速度。
(2)Google App Engine:Google App Engine(GAE),是谷歌推出的云平臺,它完全把CPU、內存等硬件基礎設施抽象化,這樣只需要關注代碼的編寫,不需要關注硬件、操作系統或者物理位置。Python是GAE最早支持編程的語言之一,任何使用Python編寫的程序,都可以配合Google Python API,很方便地在GAE上創建、部署、運行Python程序。
(3)Caffe(Convolutional Architecture for Fast Feature Embedding):Caffe是由Berkeley AI Research(BAIR)和Berkeley Vision and Learning Center (BVLC)社區貢獻者開發的另一個深度學習框架。同Tensorflow一樣,Caffe也是采用C++進行編寫,然后提供Python封裝,從而既可以利用C++的高執行效率,也可享受Python的高開發效率。
(4)在好萊塢,工業光魔公司(Industrial Light) 采用Python制作商業動畫,在“阿貝斯(Abyss)”“星球之旅(Star Trek)”“Indiana Jones”等超級大片中驚艷登場。endprint
(5)ERP和CRM軟件的開發也開始基于Python完成;Red Hat曾用Python和Tk一起成功開發配置和管理操作系統的可視界面,整個系統可以全面控制Linux操作系統,并根據用戶選擇對配置文件作自動更新。
正由于Python是受到業界的歡迎,國外很多高校(如麻省理工學院、斯坦福大學、加州大學洛杉磯分校等)已經用Python作為程序設計語言的教學對象。在Coursera等在線教育平臺上,可以發現有來自密歇根大學、萊斯大學、約翰霍普金斯大學等眾多高校的Python課程;國內南京大學張莉老師的課程也在其中。然而國內這方面的工作做得還遠遠不夠。截至2015年,我國開設Python語言教學的高校不超過10所[3]。目前在國內大力推動Python教學改革的主要有北京理工大學嵩天老師等人,已編著并出版相應的大學教材[4],受到廣泛歡迎。哈爾濱工業大學車萬翔老師等人分析了C語言作為入門語言的不足和Python作為入門語言的優勢,闡述了計算機專業高級語言程序設計課程的改革方案和實施效果[5]。南京大學張莉老師發表了《基于MOOC的“用Python玩轉數據”翻轉課堂實踐與研究》,研究證明:采用Python教學可以較好地提高學生的主動學習能力、學習興趣和熱情以及問題求解能力[6]。
3 基于Python的教學科研應用改革案例
3.1 輸入輸出
輸入輸出(I/O)是每個程序都必須具備的重要功能。常見的I/O可以分為3類:標準I/O(終端打印等)、文件I/O和網絡I/O。以終端I/O為例:
/* Basic I/O in C */
#include
int main()
{
char name[20]; /* char數組,保存第一行輸入,作為名字輸出 */
scanf("%s", name); /*讀取第一行輸入 */
printf("Hello %s\n", name);
return 0;
}
以上用C語言編寫的有效代碼共計8行,輸入輸出都采用標準庫函數。由于C語言本身設計方面的缺陷(如果第一行輸入超出char數組大小),可能導致嚴重的緩沖區溢出問題。針對這一問題,C++對數組越界進行了保護,從而提高系統安全性。
如果采用Java實現,則有效代碼共10行。由于Java的面向對象編程思想,下面這個示例程序中多了很多對象構造的流程,引用的庫看起來也相對較多,如下所示。我們只需要對這段代碼進行稍微修改,就可以實現網絡I/O和文件I/O。例如,替換“System.in”,就能夠實現對文件或者網絡流讀取。將“Reader”和“InputStream”替換,就能夠實現寫入。
/ * Basic I/O in Java */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class HelloWorld {
public static void main(String[] args) throws Exception { /*所有Java程序的入口函數 */
/* 新建輸入對象,用來讀取標準輸入。其中對象構造有嵌套*/
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String name = reader.readLine(); /* 讀取第一行輸入 */
System.out.printf("Hello %s\n", name);
}
}
相比之下,基于Python的代碼則非常短小簡潔:
/* Basic I/O in Python */
import sys
name = sys.stdin.readline() /* 讀取第一行輸入 */
print("Hello " + name)
有效代碼僅僅只有3行!同樣,替換其中的“sys.stdin”可以實現對文件讀取。對于動態類型的Python來說,所有的變量都不需要繁復的聲明,直接用就可以,再加上解釋執行的特點,無需定義入口函數即可運行。
以上是對C/C++、Java、Python在基本終端I/O操作上的比較,當推廣到文件I/O和網絡I/O后,Python的優勢會更突出,詳見表1。
3.2 數據操作
數據處理是大數據時代我們面臨的首要問題。然而,由于信息化系統建設過程中,數據可能以不同的結構存在,可能是純文本文件、CSV格式,也可能是Excel格式,或者是各種不同廠商的數據庫格式。
當然,可以采用C++或Java來讀取各種異構數據源,但過程相當繁瑣,需要利用各種底層驅動,甚至是一些商業化組件。以Excel文件讀取為例,為了處理Excel數據,C/C++代碼需要用到libxl商業庫,而Java也需要用到Apache POI開源庫。而利用Python對Excel文件進行讀取則需要利用Pandas開源數據處理分析庫,示例代碼如下:
/* Read Excel in Python */
import pandas
df = pandas.read_excel('sample.xls')
print df.columns /* 輸出列名 */
values = df['列名'].values /* 獲取某一列的所有數據 */
FORMAT = ['列名1', '列名2', '列名3'] /* 獲取指定列組成的數據幀 */
df_selected = df[FORMAT]
總的來說,在數據庫操作方面,C++、Java和Python的支持都非常好。C++和Java都為SQL提供了標準的連接、驅動管理類,不同的數據庫只需要加載不同的驅動就可以。Java對數據庫有比較好的語言級別支持,相應的驅動也比較豐富。Python也提供語言級別的支持,同時第三方庫十分豐富,甚至一種數據庫有多個不同的連接庫。另外值得一提的是, 盡管當前很多流行的分布式大數據平臺及分布式數據庫使用Java編寫,但利用Python同樣能夠方便地基于第三方庫實現操作Hbase、Hive以及其他非關系數據庫,如Mongodb、Redis等,這種特點是C/C++不能比擬的。表2為Python與C++、Java在數據庫操作上的比較。
由于Python對各種文件和數據庫的支持都非常好,它十分適合編寫數據庫之間,數據庫與文件之間相互導入導出數據的腳本,是大數據處理的首選語言。
3.3 數據可視化
豐富的可視化數據圖形能夠更好地對數據進行展示。利用數據可視化,可方便分析人員從宏觀上了解數據的形態和分布,或者進行最后的結果展示。
Python提供了豐富的數據可視化工具,如pandas、Seaborn、Bokeh、matplotlib等。下面以matplotlib為例說明如何利用Python完成數據繪圖與可視化。
假定我們要展現的數據用CSV格式保存,內容見表3。目標是基于matplotlib進行直觀的數據總體分布展示,例如利用直方圖統計年齡分布、利用箱體圖展示薪資水平、利用散點圖繪制年齡與收入的相關關系。完整代碼如下:
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("example.csv") /* 讀取數據 */
fig = plt.figure()
ax1 = fig.add_subplot(1,4,1) /* 定義展示布局 */
ax1.hist(df["Age"], bins = 5) /* 定義直方圖 */
plt.axis([20,45,0,5])
plt.title("Age distribution")
plt.xlabel("Age")
plt.ylabel("Employee")
plt.show()
ax2 = fig.add_subplot(1,4,2) /* 確定圖在畫布中的位置 */
ax2.boxplot(df["Age"]) /* 定義箱線圖 */
ax3 = fig.add_subplot(1,4,3)
ax3.bar(df["Age"],df["Income"]) /* 定義條形圖 */
ax3.set_title("Income distribution")
ax3.set_xlabel("Age")
ax3.set_ylabel("Income")
ax4 = fig.add_subplot(1,4,4)
ax4.scatter(df["Age"],df["Income"]) /* 定義散點圖 */
ax4.set_title("Income distribution")
ax4.set_xlabel("Age")
ax4.set_ylabel("Income")
plt.show()
得到的可視化效果如圖1所示。
Python的開放性還表現為利用支持庫,實現如圖1所示的各類統計效果和復雜的展示(如地圖、熱力圖以及復雜網絡等)。此外,除了構建在Python之上的原生庫,還有大量其他的數據可視化工具包(如基于Javascript的Plot.ly、百度的Echart等),這些工具包同時也提供Python的調用封裝,豐富了基于Python的可視化效果,體現了強大的Python計算生態。
3.4 圖像處理與深度神經網絡
深度學習的出現點燃了研究者對神經網絡和機器學習的研究熱情,特別是基于Google Tensorflow的AlphaGo接連擊敗世界圍棋冠軍,更加吸引了人們對深度學習的關注。在深度學習領域,很多優秀的開源平臺與框架(如Tensorflow、Caffe、Theano、MXNet等)都提供Python接口。這也從側面反映出Python計算生態已經建立。下面以Tensorflow提供的Python接口為例,介紹Python在圖像處理與深度神經網絡方面的應用。
卷積神經網絡是深度學習的一個重要模型。Tensorflow已經屏蔽了關于卷積神經網絡的具體結構,如神經元函數、拓撲連接狀態等。程序員只需要通過參數指定,就能完成網絡模型的設計,例如
conv1 = tf.layers.conv2d(inputs=input_layer,filters=32,kernel_size=[5, 5], padding="same",activation=tf.nn.relu)
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
通過設置輸入層ID、激活函數、padding方法、核大小等參數,就可以唯一確定輸入層、卷積層、池化層,再通過調整參數并選擇一定的學習算法,結合pillow、scikit-image等基于Python的圖像處理工具包,從而可以利用深度網絡自動完成特征學習,完成模式識別或圖像分類工作。
4 結 語
每一種程序設計語言的發展都與時代背景密切相關。Python作為一種開放性語言,具有簡潔高效的特點,并且擁有豐富的標準庫和第三方工具包,使得它處理起各類數據具有得天獨厚的優勢。教學實踐證明,Python在輸入輸出、數據操作、數據可視化、圖像處理與深度神經網絡等有諸多優點,顯示Python計算生態已經逐漸形成并不斷完善。根據多年的實際教學效果來看,由于學生能夠快速基于Python編寫強大的應用模塊,這對于提升學生學習興趣、提高知識掌握水平,是大有裨益的。在今后的教學工作中,具有一定的推廣價值。
參考文獻:
[1] 王雪. 北理工承辦“全國高校Python語言及計算生態教學研討會”[EB/OL]. [2017-04-25]. http://www.bit.edu.cn/xww/zhxw/139071.htm.
[2] 黃文堅, 唐源. TensorFlow實戰[M]. 北京: 電子工業出版社, 2017.
[3] 嵩天, 黃天羽, 禮欣. Python語言: 程序設計課程教學改革的理想選擇[J]. 中國大學教學, 2016(2): 42-47.
[4] 嵩天, 黃天羽, 禮欣. Python語言程序設計基礎[M]. 2版. 北京: 高等教育出版社, 2017.
[5] 車萬翔, 蘇小紅, 袁永峰, 等. 計算機專業高級語言程序設計課程改革探索[J]. 計算機教育, 2014(13): 56-58.
[6] 張莉, 金瑩, 張潔. 基于MOOC的“用Python玩轉數據”翻轉課堂實踐與研究[J]. 工業和信息化教育, 2017(3): 70-76.
(編輯:彭遠紅)endprint