摘要:但是由于程序并沒(méi)有那么快,開(kāi)發(fā)人員多年來(lái)創(chuàng)建了幾個(gè)的編譯器,包括和。在下面的細(xì)分中,所有的編譯器都針對(duì)進(jìn)行基準(zhǔn)測(cè)試。編譯器是系列的一部分,旨在作為的現(xiàn)代替代品。不僅僅是的編譯器,它是的超集,支持與的互操作性。
簡(jiǎn)評(píng):Python 和其他的解釋型語(yǔ)言一樣經(jīng)常被吐槽性能不行,所以開(kāi)發(fā)人員為了提升性能創(chuàng)建了不少編譯器,本文則選取其中的四個(gè)做了基準(zhǔn)測(cè)試。
Python 其實(shí)是一種相當(dāng)快的語(yǔ)言,但它并不像編譯型語(yǔ)言那么快。 這是因?yàn)楣俜綄?shí)現(xiàn)的 CPython 解釋執(zhí)行的,更準(zhǔn)確地說(shuō),是 Python 代碼被編譯為字節(jié)碼,然后進(jìn)行解釋。這對(duì)學(xué)習(xí)是很有好處的,因?yàn)榭梢栽?Python REPL 中運(yùn)行代碼并立即查看結(jié)果,而不必編譯和執(zhí)行。 但是由于 Python 程序并沒(méi)有那么快,開(kāi)發(fā)人員多年來(lái)創(chuàng)建了幾個(gè) Python 的編譯器,包括 IronPython 和 Jython。
快速的性能并不是編譯的唯一原因,可能諸如 Python 之類的腳本語(yǔ)言最大的缺點(diǎn)是你需要隱式地向客戶提供源代碼。
我想比較同一平臺(tái)上的一些 Python 編譯器,特別是那些支持 Python 3.x 的編譯器。最后,我選擇了四個(gè),都在 Ubuntu Linux上運(yùn)行,他們是 Nuitka,PyPy,Cython 和 cx_Freeze。
比較 Python 編譯器
有人已經(jīng)完成了創(chuàng)建 Python 基準(zhǔn)測(cè)試的工作。我選擇了 PyStone,這是 Python 的創(chuàng)建者Guido van Rossum 對(duì) C 程序的翻譯(而 C 程序本身是 Ada 程序的翻譯)。 我在 GitHub 上找到了開(kāi)發(fā)人員 Christopher Arndt 的轉(zhuǎn)換版本,它能夠兼容 Python 3。 下面是 Pystone 的CPython(即標(biāo)準(zhǔn) Python)性能:
Python 2.7.15Rc1 2 : 272,647 pystones/second. Python 3.6.5 : 175,817
正如你所看到的,Python 2 和 Python 3 之間有很大的區(qū)別(每秒 Pystones 越多越好)。在下面的細(xì)分中,所有的 Python 編譯器都針對(duì) Python 3 進(jìn)行基準(zhǔn)測(cè)試。
Nuitka
盡管可以按照下載頁(yè)面上的說(shuō)明操作,但 Ubuntu 上的只需:
$ sudo apt install Nuitka
Nuitka 還需要一個(gè) C 編譯器,所以我下載了 clang??梢允褂靡韵路椒ò惭b它:
$ sudo apt install clang
Nuitka 默認(rèn)使用 gcc,但是一個(gè)參數(shù)允許你使用 clang,所以我用兩者測(cè)試了它。 clang 編譯器是 llvm 系列的一部分,旨在作為 gcc 的現(xiàn)代替代品。使用 gcc 編譯 pystone.py 就像這個(gè)(第一行)一樣簡(jiǎn)單,或者使用 clang(第二行),并使用鏈接時(shí)間優(yōu)化 gcc(第三行):
$ nuitka pystone.py $ nuitka pystone.py --clang $ nuitka pystone.py --lto
編譯(大約 10 秒鐘)完成后,我從終端運(yùn)行了 pystone:
$ ./pystone.exe 500000
結(jié)果是
Size Execution pystones/sec 1. 223.176 Kb 597,000 2. 195,424 Kb 610,000 3. 194.2 kb 600,000
這些是 5 次運(yùn)行的平均值,我盡可能多地關(guān)閉了進(jìn)程。
PyPy
Guido van Rossum 曾經(jīng)說(shuō)過(guò):「如果你希望你的代碼運(yùn)行得更快,你應(yīng)該只使用PyPy?!刮覍⒕幾g好的二進(jìn)制文件下載到一個(gè)文件夾中,并將 pystone.py 復(fù)制到其下的 bin 文件夾中。然后我像這樣運(yùn)行:
$ ./pypy3.5 pystone.py
結(jié)果是驚人的 1,776,001 pystones/sec,幾乎是 Nuitka 的三倍。
PyPy 使用即時(shí)編譯器并做了一些非常巧妙的東西來(lái)實(shí)現(xiàn)它的速度。根據(jù)基準(zhǔn)測(cè)試的報(bào)告,它平均比 CPython 快 7.6 倍。 我很容易相信。 唯一(輕微)的缺點(diǎn)是它總是落后于 Python 版本。
生成一個(gè) EXE 需要一些工作,你必須將你的 Python 編寫成一個(gè)名為 RPython 的子集。
Cython
Cython 不僅僅是 Python 的編譯器,它是 Python 的超集,支持與 C / C++ 的互操作性。 CPython是用 C 編寫的,所以它是一種通??梢院芎玫嘏c Python 混編的語(yǔ)言。
使用 Cython 進(jìn)行設(shè)置有點(diǎn)繁瑣,它不像 Nuitka 那樣開(kāi)箱即用。首先,必須從擴(kuò)展名為 .pyx的 Python 文件開(kāi)始,你運(yùn)行 Cython 來(lái)創(chuàng)建一個(gè) pystone.c 文件:
$ cython pystone.pyx --embed
不要忽略 –embed 參數(shù),接下來(lái),你用這條命令編譯 pystone.c:
$ gcc $(python3-config --includes) pystone.c -lpython3.6m -o pystone.exe
如果遇到任何錯(cuò)誤,例如「找不到 -lpython 版本」,則可能是因?yàn)槟愕?Python 版本。要查看安裝的版本,請(qǐng)運(yùn)行以下命令:
$ pkg-config --cflags python3
畢竟,Cython 只給出 228,527 pystones/sec,但是,Cython 需要你做一些指定變量類型的工作。Python 是一種動(dòng)態(tài)語(yǔ)言,因此沒(méi)有指定類型, Cython 使用靜態(tài)編譯,使用 C 類型變量可以產(chǎn)生更好的優(yōu)化代碼。 (文檔相當(dāng)廣泛,需要閱讀。)
Size Execution pystones/sec 1. 219,552 Kb 228,527 cx_freeze
這是一套用于將 Python 腳本「凍結(jié)」為可執(zhí)行文件的腳本和模塊,可以在GitHub上找到。我安裝了它并創(chuàng)建了一個(gè)凍結(jié)文件夾來(lái)管理內(nèi)容:
$ sudo pip3 install cx_Freeze --upgrade
我在安裝腳本中發(fā)現(xiàn)的一個(gè)問(wèn)題是缺少“l(fā)z”的錯(cuò)誤。你需要安裝 zlib 運(yùn)行它來(lái)安裝它:
$ sudo apt install zlib1g-dev
之后,cx_Freeze 命令使用 pystone.py 腳本創(chuàng)建了一個(gè) dist 文件夾,其中包含一個(gè) lib 文件夾,一個(gè) 5MB 的 lib 文件和 pystone 應(yīng)用程序文件:
$ cxfreeze pystone.py --target-dir dist Size Execution pystones/sec 1. 10,216 174,822
不是最快的性能,因?yàn)樗c CPython 的速度相同。 (Python 凍結(jié)包括將應(yīng)用程序與所需的Python 元素一起放在單個(gè)文件(或文件夾)中,而不是編譯,這意味著目標(biāo)不需要Python。)
結(jié)論
我對(duì) PyPy 的表現(xiàn)感到敬畏,編譯非???,在按下回車鍵后不到一秒就產(chǎn)生了結(jié)果。 如果你想要一個(gè) exe,我推薦 Nuitka,這是一個(gè)不費(fèi)吹灰之力的編譯,運(yùn)行速度比 CPython 快。你也可以自己試用這些 Python 編譯器,看看哪種方法最適合特定需求。
原文:4 Fast Python Compilers for 2018
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/42051.html
摘要:入門,第一個(gè)這是一門很新的語(yǔ)言,年前后正式公布,算起來(lái)是比較年輕的編程語(yǔ)言了,更重要的是它是面向程序員的函數(shù)式編程語(yǔ)言,它的代碼運(yùn)行在之上。它通過(guò)編輯類工具,帶來(lái)了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語(yǔ)言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺(jué)已經(jīng)到來(lái)了,總結(jié)過(guò)去的 2017,相信小伙們一定有很多收獲...
摘要:入門,第一個(gè)這是一門很新的語(yǔ)言,年前后正式公布,算起來(lái)是比較年輕的編程語(yǔ)言了,更重要的是它是面向程序員的函數(shù)式編程語(yǔ)言,它的代碼運(yùn)行在之上。它通過(guò)編輯類工具,帶來(lái)了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語(yǔ)言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺(jué)已經(jīng)到來(lái)了,總結(jié)過(guò)去的 2017,相信小伙們一定有很多收獲...
摘要:入門,第一個(gè)這是一門很新的語(yǔ)言,年前后正式公布,算起來(lái)是比較年輕的編程語(yǔ)言了,更重要的是它是面向程序員的函數(shù)式編程語(yǔ)言,它的代碼運(yùn)行在之上。它通過(guò)編輯類工具,帶來(lái)了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語(yǔ)言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺(jué)已經(jīng)到來(lái)了,總結(jié)過(guò)去的 2017,相信小伙們一定有很多收獲...
摘要:通過(guò)本文的學(xué)習(xí),可以快速掌握網(wǎng)絡(luò)爬蟲(chóng)基礎(chǔ),結(jié)合實(shí)戰(zhàn)練習(xí),寫出一些簡(jiǎn)單的爬蟲(chóng)項(xiàng)目。從技術(shù)手段來(lái)說(shuō),網(wǎng)絡(luò)爬蟲(chóng)有多種實(shí)現(xiàn)方案,如。二網(wǎng)絡(luò)爬蟲(chóng)技術(shù)基礎(chǔ)在本次課中,將使用技術(shù)手段進(jìn)行項(xiàng)目的編寫。 摘要:本文詳細(xì)講解了python網(wǎng)絡(luò)爬蟲(chóng),并介紹抓包分析等技術(shù),實(shí)戰(zhàn)訓(xùn)練三個(gè)網(wǎng)絡(luò)爬蟲(chóng)案例,并簡(jiǎn)單補(bǔ)充了常見(jiàn)的反爬策略與反爬攻克手段。通過(guò)本文的學(xué)習(xí),可以快速掌握網(wǎng)絡(luò)爬蟲(chóng)基礎(chǔ),結(jié)合實(shí)戰(zhàn)練習(xí),寫出一些簡(jiǎn)單的...
摘要:年月宣布支持時(shí)間延長(zhǎng)到年。更詳細(xì)的發(fā)布列表參閱官網(wǎng)的版本號(hào)分為三段,形如。其中表示大版本號(hào),一般當(dāng)整體重寫,或出現(xiàn)不向后兼容的改變時(shí),增加表示功能更新,出現(xiàn)新功能時(shí)增加表示小的改動(dòng)如修復(fù)了某個(gè),只要有修改就增加。年公司正式發(fā)布。 < 返回索引頁(yè) Python語(yǔ)言簡(jiǎn)介 Python介紹及發(fā)展 介紹 Python 官方網(wǎng)站:https://www.python.org/, 大家可以到此處下...
閱讀 1183·2021-11-08 13:13
閱讀 1763·2019-08-30 15:55
閱讀 2827·2019-08-29 11:26
閱讀 2488·2019-08-26 13:56
閱讀 2615·2019-08-26 12:15
閱讀 2194·2019-08-26 11:41
閱讀 1452·2019-08-26 11:00
閱讀 1580·2019-08-23 18:30