官术网_书友最值得收藏!

1.2 為什么使用Python進行數據分析

Python語言極具吸引力。自從1991年誕生以來,Python如今已經成為最受歡迎的解釋型編程語言,其他的解釋型語言包括Perl、Ruby等。自2005年起,由于擁有大量的Web框架(例如Ruby的Rails和Python的Django),使用Python和Ruby構建網站變得尤為流行。這些語言常被稱作腳本語言,因為它們可以用于編寫簡短的程序代碼,或者編寫自動化控制其他任務的腳本。但我個人并不喜歡“腳本語言”這個詞,因為它的潛在意思好像是說這些語言無法用于構建正規的大型軟件。在眾多解釋型語言中,由于各種歷史和文化原因,Python孕育了一個龐大而活躍的科學計算和數據分析社區。在過去的20年間,Python從一門邊緣或“自擔風險”的科學計算語言成長為學界和工業界數據科學、機器學習、軟件開發最重要的語言之一。

在數據分析、交互式計算以及數據可視化方面,Python不可避免地與其他開源和商業領域的特定編程語言和工具進行對比,例如R、MATLAB、SAS、Stata等。由于近年來Python的庫(例如pandas和scikit-learn)不斷得到優化,越來越多的人使用Python進行數據分析。再加上Python在通用編程方面的強大能力,它已成為構建數據應用的優選方案。

1.2.1 Python作為膠水語言

Python在科學計算領域的成功,部分得益于它能夠輕松集成C、C++以及Fortran代碼。大部分現代計算環境都利用了一些Fortran和C庫來實現線性代數運算、最優化、積分、快速傅里葉變換以及其他諸如此類的算法。許多企業和國家實驗室也利用Python來“黏合”那些已經用了數十年的遺留軟件。

大多數軟件都是由兩部分代碼組成的,一小部分需要占用大部分執行時間的代碼,以及大部分不經常執行的“膠水代碼”。在許多情況下,膠水代碼的執行時間都是微不足道的。開發人員的精力幾乎都花在優化計算瓶頸上,有時更需要轉換為底層的語言(比如C語言)。

1.2.2 解決“雙語”問題

通常,很多機構都會使用專業領域的計算語言(如SAS和R)針對新想法做研究、構建原型和測試,然后再將這些想法移植到規模更大的生產系統中(可能是用Java、C#或C++編寫的)。人們逐漸意識到,Python不僅適用于研究和構建原型,也適用于構建生產系統。既然一種語言就足夠了,還有必要維持兩套開發環境嗎?我相信越來越多的企業會統一開發環境,因為研究人員和軟件工程師使用同一套編程工具將會給企業帶來非常顯著的組織效益。

在過去的十年間,涌現出一批解決“雙語”問題的新途徑,例如Julia編程語言。在許多場景中,為了讓Python物盡其用,需要用到C或C++等底層語言,然后將Python與其相連。盡管這樣有些麻煩,但即時(Just-In-Time,JIT)編譯技術能讓人們不必脫離Python編程環境,使用像Numba這樣的庫,就能在許多算法中獲得卓越的性能。

1.2.3 為何不使用Python

雖然Python非常適合構建分析應用以及通用系統,但它對不少應用場景的適用性較差。

由于Python是解釋型編程語言,因此通常大部分Python代碼運行起來都要比用編譯型語言(比如Java和C++)編寫的代碼慢得多。由于程序員的時間通常都比CPU時間值錢,因此許多人也愿意對此做一些取舍。但是,在那些低延遲或高資源利用率的應用(例如高頻交易系統)中,為了達到最高性能,花費時間使用諸如C++這樣底層(但生產效率更低)的語言進行編程也是值得的。

對于高并發、多線程的應用程序,尤其是擁有許多計算密集型線程的應用程序而言,Python并不是一種理想的編程語言。這是因為Python有一個叫作全局解釋器鎖(Global Interpreter Lock,GIL)的組件,這是一種防止解釋器同時執行多條Python字節碼指令的機制。有關“為什么會存在GIL”的技術性原因超出了本書的范圍。雖然很多大數據處理應用程序為了能在較短的時間內完成數據集的處理工作都需要運行在計算機集群上,但是仍然有一些場景需要用單進程多線程系統來解決。

這并不是說Python不能執行真正的多線程并行代碼。例如,Python的C擴展使用原生的C或C++的多線程,可以并行運行而不被GIL影響,只要它們不需要頻繁地與Python對象交互。

主站蜘蛛池模板: 友谊县| 淄博市| 唐山市| 雅江县| 辽宁省| 莆田市| 海南省| 酒泉市| 洛隆县| 五家渠市| 秦安县| 石景山区| 康乐县| 云南省| 从江县| 合水县| 三亚市| 承德市| 华亭县| 远安县| 公主岭市| 牙克石市| 湄潭县| 洮南市| 蓝田县| 怀宁县| 巫山县| 仲巴县| 响水县| 延安市| 浦北县| 台安县| 宣城市| 资阳市| 藁城市| 科技| 东乡族自治县| 贺州市| 绿春县| 元阳县| 稻城县|