這篇文章主要介紹“Python代碼的優(yōu)化方法有哪些”,在日常操作中,相信很多人在Python代碼的優(yōu)化方法有哪些問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”P(pán)ython代碼的優(yōu)化方法有哪些”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)絡(luò)空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、紅橋網(wǎng)站維護(hù)、網(wǎng)站推廣。
1. 優(yōu)化代碼和算法
首先,要仔細(xì)閱讀你的代碼和算法。通過(guò)執(zhí)行更優(yōu)算法或添加緩存可以解決很多速度問(wèn)題。具體的準(zhǔn)則能寫(xiě)整本書(shū),但要遵循的一些通用準(zhǔn)則是:
測(cè)試,不要猜測(cè)。測(cè)試代碼哪些部分的運(yùn)行耗費(fèi)最長(zhǎng)時(shí)間,首先關(guān)注這些部分。
減少內(nèi)存使用量。通常情況下,請(qǐng)嘗試減少內(nèi)存使用量。例如:逐行分析一個(gè)大型文件,而不先將其存儲(chǔ)到內(nèi)存中。
執(zhí)行緩存。如果你從磁盤(pán),網(wǎng)絡(luò)和數(shù)據(jù)庫(kù)中執(zhí)行許多重復(fù)的搜索,那么執(zhí)行緩存可能是一個(gè)很大的優(yōu)化。
盡可能減少代碼中的迭代次數(shù),尤其減少迭代內(nèi)部操作的次數(shù)。
避免(深度)遞歸。對(duì)Python解釋器而言,這需要大量?jī)?nèi)存和內(nèi)務(wù)處理,改用生成器和迭代等。
重用對(duì)象,而不是在每次迭代中創(chuàng)建新對(duì)象。Python必須清理已經(jīng)創(chuàng)建的每個(gè)對(duì)象才能釋放內(nèi)存。這被稱作垃圾回收。許多未使用對(duì)象的垃圾回收過(guò)程會(huì)大大降低軟件速度。
不要這樣做。你真的需要執(zhí)行該操作嗎?它可以被放在之后完成嗎?或是該操作可被一次完成,并可以存儲(chǔ)其結(jié)果而不進(jìn)行一遍又一遍地計(jì)算?
2. 使用PyPy
你可能正在使用Python的參考實(shí)現(xiàn)——CPython,它之所以被稱作CPython,是因?yàn)樗蒀語(yǔ)言編寫(xiě)而成。很多人都在用它。
但如果確定自己的代碼為計(jì)算密集型,PyPy會(huì)是一個(gè)更好的選擇。它有可能是一種快速解決方案,且無(wú)需更改單行代碼。
PyPy聲稱:它比CPython平均快4.4倍。它通過(guò)使用一種叫作即時(shí)編譯(JIT)的技術(shù)加快代碼執(zhí)行速度,其他的JIT還包括Java和.NET框架。而CPython使用解釋器執(zhí)行代碼,盡管這提供了很大程度的靈活性,速度卻非常慢。
使用JIT,可以在運(yùn)行程序的同時(shí)編譯代碼。它結(jié)合了提前編譯(由C和C ++等語(yǔ)言使用)的速度優(yōu)勢(shì)和解釋器的靈活性。此外,JIT編譯器還可以在代碼運(yùn)行時(shí)繼續(xù)將其優(yōu)化。代碼運(yùn)行時(shí)間越長(zhǎng),就越優(yōu)化。
PyPy在近幾年里發(fā)展很快,通常可以被用作Python 2和3的直接替代。它也可以與Pipenv等工具完美配合使用。
3. 使用Asyncio
Asyncio是Python中一個(gè)相對(duì)較新的核心庫(kù)。它與線程解決了相同的問(wèn)題:即加速了I/O密集型軟件系統(tǒng),但Asyncio實(shí)現(xiàn)方式不同。
筆者其實(shí)并不喜歡在Python中使用asyncio。Asyncio相當(dāng)復(fù)雜,特別是對(duì)于初學(xué)者。而且由于asyncio庫(kù)在過(guò)去的幾年中發(fā)展了很多,網(wǎng)絡(luò)上的教程和示例代碼通常已經(jīng)過(guò)時(shí)。
但這并不意味著它沒(méi)有用。這是一種強(qiáng)大的范例,可用于許多高性能應(yīng)用程序。
4. 使用多線程
多數(shù)軟件系統(tǒng)為I/O密集型,而非計(jì)算密集型:
I/O密集型 —軟件系統(tǒng)通常在等待輸入/輸出操作完成。從網(wǎng)絡(luò)或慢速存儲(chǔ)器中獲取數(shù)據(jù)時(shí)通常是這種情況。
計(jì)算密集型 —軟件系統(tǒng)使CPU(中央處理器)達(dá)到極限。它使用CPU的所有功能來(lái)生成所需的結(jié)果。
在從網(wǎng)絡(luò)或磁盤(pán)中等待回答時(shí),可以使用多個(gè)線程維持其他部分的運(yùn)行。
線程是獨(dú)立的執(zhí)行序列。默認(rèn)情況下,Python程序具有一個(gè)主線程。但可以創(chuàng)建更多線程,并讓Python在不同線程之間轉(zhuǎn)換。這種轉(zhuǎn)換發(fā)生非???,顯得似乎在同時(shí)并排運(yùn)行。
線程是獨(dú)立的執(zhí)行序列,共享相同的存儲(chǔ)
不同于其他語(yǔ)言,Python多線程不能同時(shí)運(yùn)行,而是輪流運(yùn)行,這主要是因?yàn)樗娜纸忉屍麈i(GIL)的機(jī)制。
可見(jiàn),多線程將對(duì)I / O密集型軟件系統(tǒng)產(chǎn)生巨大影響,但對(duì)計(jì)算密集型軟件系統(tǒng)而言用途甚微。
為何會(huì)這樣?很簡(jiǎn)單。當(dāng)一個(gè)線程等待來(lái)自網(wǎng)絡(luò)的回答時(shí),其他線程能夠繼續(xù)運(yùn)行。如果執(zhí)行大量網(wǎng)絡(luò)請(qǐng)求,使用多線程會(huì)大有不同。但如果多線程正在執(zhí)行大量計(jì)算,則它們只是等候自己的輪次再繼續(xù)執(zhí)行。線程只會(huì)引入更多的開(kāi)銷(xiāo)。
5. 同時(shí)使用更多處理器
如果軟件系統(tǒng)為計(jì)算密集型,則通??梢酝ㄟ^(guò)同時(shí)使用更多處理器的方式來(lái)重寫(xiě)代碼。這樣,就可以線性擴(kuò)展執(zhí)行速度。
這被稱做并行性。并非所有算法都可以并行運(yùn)行。例如,簡(jiǎn)單地并行化遞歸算法是不可能的。但是幾乎總會(huì)有一種替代算法可以很好地進(jìn)行并行工作。
有兩種使用更多處理器的方式:
在同一臺(tái)計(jì)算機(jī)上使用多個(gè)處理器和/或內(nèi)核。在Python中,這可以通過(guò)使用多處理庫(kù)來(lái)完成。
用計(jì)算機(jī)網(wǎng)絡(luò)來(lái)使用分布在多臺(tái)機(jī)器上的處理器。我們稱其為分布式計(jì)算。
不同于線程庫(kù),多處理庫(kù)繞過(guò)了Python全局解釋器鎖。它實(shí)際上是通過(guò)生成多個(gè)Python實(shí)例來(lái)實(shí)現(xiàn)的。因此,使用多線程在一個(gè)Python進(jìn)程中輪流執(zhí)行,你將擁有多個(gè)Python處理器來(lái)同時(shí)運(yùn)行代碼。
可視化多處理
多處理庫(kù)又與線程庫(kù)十分相似。那為什么還要考慮線程化?沒(méi)錯(cuò),線程處理“更輕便”。它只需要一個(gè)正在運(yùn)行的Python解釋器,所需的內(nèi)存更少,生成新進(jìn)程也有其開(kāi)銷(xiāo)。因此,如果代碼為I/O密集型,使用線程可能足夠了。
使軟件系統(tǒng)并行工作后,將分布式計(jì)算與諸如Hadoop之類(lèi)的功能結(jié)合使用僅需一小步。通過(guò)利用云計(jì)算平臺(tái),目前可以相對(duì)輕松地加快運(yùn)行速度。例如,可以在云中處理龐大的數(shù)據(jù)集,并在本地使用結(jié)果。使用混合操作方式,可以節(jié)省一些現(xiàn)金,要知道,云平臺(tái)的計(jì)算功能可是非常昂貴的。
到此,關(guān)于“Python代碼的優(yōu)化方法有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!