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