- Python編程從新手到高手
- (美)賈森·C.麥克唐納
- 1832字
- 2025-08-07 17:53:05
1.2 破除誤解:Python不是什么
人們對Python有很多的誤解,其中一些誤解導(dǎo)致人們在某些應(yīng)用場景下想方設(shè)法避免使用Python,甚至完全不使用Python。
1.2.1 誤解1:Python僅僅是一種腳本語言
在我看來,“腳本語言”是討論編程語言時(shí)最令人討厭的術(shù)語之一。它暗示著這門語言不適合編寫“真正”的軟件(見誤解5)。
Python是一門圖靈完備的語言,這意味著你可以用Python實(shí)現(xiàn)任何其他編程語言,然后就可以執(zhí)行用那種語言編寫的任何程序。
換句話說,任何其他編程語言能做的事情,Python都能做到。這是否容易,乃至于是否可行,取決于你想要做什么。
1.2.2 誤解2:Python很慢
通常來說,人們很容易認(rèn)為,像Python這樣更高級的或解釋型編程語言比C語言這樣更低級的或編譯型編程語言慢。事實(shí)上,這取決于語言的實(shí)現(xiàn)方式和使用方式。在本書中,我們將介紹幾個(gè)與提升Python代碼性能相關(guān)的概念。
Python解釋器的默認(rèn)實(shí)現(xiàn)CPython是用C語言寫的,在執(zhí)行效率上的確會比原生機(jī)器碼低。然而,有各種各樣的庫、技術(shù)以及其他Python解釋器的實(shí)現(xiàn)(包括PyPy),它們的整體性能都要好得多(參見第21章),甚至接近原生機(jī)器碼的執(zhí)行效率。
綜上所述,你應(yīng)該弄明白性能是如何影響你的項(xiàng)目的。在大多數(shù)情況下,Python的性能已經(jīng)足夠好,可以作為應(yīng)用開發(fā)、數(shù)據(jù)分析、科學(xué)計(jì)算、游戲開發(fā)、Web開發(fā)等領(lǐng)域的首選語言。CPython的性能缺陷通常只會在你面對一些特定的、對性能要求極高的場景時(shí)才會成為問題。即使如此,也有辦法解決這些問題。對大多數(shù)項(xiàng)目來說,Python的基本性能已經(jīng)足夠了。
1.2.3 誤解3:Python不能被編譯
Python是一門“解釋型語言”,這意味著代碼在運(yùn)行時(shí)由語言的解釋器讀取、解釋和執(zhí)行。運(yùn)行Python項(xiàng)目的最終用戶通常需要安裝Python解釋器。
與之對應(yīng)的是所謂的“匯編型語言”,比如C語言、C++和FORTRAN。在這些語言中,編譯的最終結(jié)果是機(jī)器碼,可以直接在任何兼容的計(jì)算機(jī)上執(zhí)行,而不需要安裝其他程序(或者將其與代碼捆綁在一起)。
有關(guān)“編譯型語言”這個(gè)術(shù)語的爭議非常多,這就是為什么我喜歡使用“解釋型語言”和“匯編型語言”兩個(gè)術(shù)語來區(qū)分它們。實(shí)際上相關(guān)的爭論可以說是個(gè)無底洞。
很多開發(fā)者認(rèn)為Python代碼不能編譯成機(jī)器碼,這似乎是顯而易見的結(jié)論。事實(shí)上,Python代碼可以編譯成機(jī)器碼,盡管這種情況很少見。
如果你想嘗試一下這條路徑,那么這里有幾個(gè)選項(xiàng)。在UNIX系統(tǒng)中,內(nèi)置的Freeze工具可將Python字節(jié)碼轉(zhuǎn)換為C語言數(shù)組,然后將這些C語言代碼匯編為機(jī)器碼。但是這并不會產(chǎn)生真正的匯編Python代碼,因?yàn)镻ython解釋器仍然需要在幕后被調(diào)用。Freeze只能在UNIX系統(tǒng)中工作。cx_Freeze工具以及Windows系統(tǒng)中的py2exe所做的事,與Freeze類似。
想要真正地將Python代碼編譯為機(jī)器碼,你必須使用中間語言。Nuitka可以用于將Python代碼轉(zhuǎn)換為C語言或C++代碼,然后將其匯編為機(jī)器碼。你也可以使用VOC將Python代碼轉(zhuǎn)換為Java代碼。Cython則允許將特殊形式的Python代碼轉(zhuǎn)換為C語言代碼,盡管它主要面向用C語言編寫Python擴(kuò)展。
1.2.4 誤解4:Python在后臺編譯
Python解釋器會將原始代碼編譯為稍后執(zhí)行所需的字節(jié)碼。解釋器包含一個(gè)虛擬機(jī),它會像CPU執(zhí)行機(jī)器碼一樣執(zhí)行Python字節(jié)碼。有時(shí),出于性能上的考慮,解釋器會提前將代碼轉(zhuǎn)換為字節(jié)碼,并生成包含字節(jié)碼的 .pyc文件。雖然這在某種意義上是“編譯”,但將代碼編譯為字節(jié)碼與將代碼編譯為機(jī)器碼之間存在一個(gè)關(guān)鍵區(qū)別:字節(jié)碼仍然需要通過解釋器執(zhí)行,而機(jī)器碼可以直接執(zhí)行,不需要額外的程序。(從技術(shù)上講,“編譯”為機(jī)器碼稱為匯編,盡管這種區(qū)別往往被忽略或忽視。)
在實(shí)踐中,大多數(shù)Python項(xiàng)目以源代碼或Python字節(jié)碼的形式分發(fā),這些代碼在安裝于用戶計(jì)算機(jī)上的Python解釋器中運(yùn)行。有時(shí),以標(biāo)準(zhǔn)的可執(zhí)行文件的方式進(jìn)行分發(fā)更為可取,例如在終端用戶計(jì)算機(jī)上安裝或在閉源項(xiàng)目中安裝。對于這些情況,Python社區(qū)提供了PyInstaller和cx_Freeze等工具。這些工具不會編譯代碼,而是將Python源代碼或字節(jié)碼與解釋器捆綁在一起,以便獨(dú)立執(zhí)行(請參閱第18章)。
1.2.5 誤解5:Python不適合大型項(xiàng)目
我經(jīng)常聽一些開發(fā)者說:“如果能將整個(gè)項(xiàng)目都放在一個(gè)文件中,那么Python就很有用?!边@種“吐槽”通?;谶@樣的誤解:具有多個(gè)文件的Python項(xiàng)目結(jié)構(gòu)令人頭大[1]。這確實(shí)是趨勢,但只是因?yàn)楹苌儆虚_發(fā)者知道如何正確地構(gòu)建Python項(xiàng)目。
[1] 譯者注:Python擅長把大項(xiàng)目變成多個(gè)簡單的“小項(xiàng)目”,所以看起來“沒有大項(xiàng)目”。
實(shí)際上,Python項(xiàng)目的結(jié)構(gòu)比C++和Java項(xiàng)目的結(jié)構(gòu)要簡單得多。一旦開發(fā)者理解了包、模塊和導(dǎo)入系統(tǒng)(請參閱第4章)的概念,就可以輕松處理多個(gè)代碼文件。
這個(gè)誤解的存在還有另外一個(gè)原因:Python是動態(tài)類型的,而不像Java或C++那樣是靜態(tài)類型的,一些人認(rèn)為這使得重構(gòu)變得更加困難。實(shí)際上,如果開發(fā)者知道如何使用Python的類型系統(tǒng),而不是與之抗?fàn)?,這就不是問題(請參閱第5章)。
- C#高級編程(第10版) C# 6 & .NET Core 1.0 (.NET開發(fā)經(jīng)典名著)
- Mastering ServiceStack
- Power Up Your PowToon Studio Project
- Elastic Stack應(yīng)用寶典
- Learning Unity 2D Game Development by Example
- PHP 7+MySQL 8動態(tài)網(wǎng)站開發(fā)從入門到精通(視頻教學(xué)版)
- Visual C++開發(fā)入行真功夫
- Statistical Application Development with R and Python(Second Edition)
- Spring技術(shù)內(nèi)幕:深入解析Spring架構(gòu)與設(shè)計(jì)原理(第2版)
- Android應(yīng)用開發(fā)實(shí)戰(zhàn)
- 大學(xué)計(jì)算機(jī)基礎(chǔ)實(shí)驗(yàn)指導(dǎo)
- Julia數(shù)據(jù)科學(xué)應(yīng)用
- MySQL 8從零開始學(xué)(視頻教學(xué)版)
- Instant Apache Camel Messaging System
- Building Business Websites with Squarespace 7(Second Edition)