自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

新聞 后端
Python是一種強(qiáng)大的編程語(yǔ)言。而且我們可以做到這一點(diǎn),使代碼更輕更快,下面我們列出了一些最好的Python代碼優(yōu)化技巧和技巧。

 [[208308]]

Python是一種強(qiáng)大的編程語(yǔ)言。而且我們可以做到這一點(diǎn),使代碼更輕更快。它不僅支持多處理功能,而且輕松實(shí)現(xiàn)。下面我們列出了一些***的Python代碼優(yōu)化技巧和技巧。


Python批評(píng)者有時(shí)會(huì)聲稱(chēng)它很慢。但是這不是因?yàn)镻ython,而是由于用于編寫(xiě)代碼的做法。在這篇文章中,您將找到加速您的Python應(yīng)用程序的提示。

由于Python是功能豐富的語(yǔ)言,所以總是有改進(jìn)的余地。如果您希望使您的Python代碼運(yùn)行得更快更有效率,那么請(qǐng)繼續(xù)閱讀。

這些技巧和Python的優(yōu)點(diǎn)在于所有的優(yōu)化技術(shù)實(shí)際上都在Python領(lǐng)域。你只需要知道它們,并在編碼時(shí)以有紀(jì)律的方式實(shí)施。最近我們寫(xiě)了一篇關(guān)于三十個(gè)基本Python編程技巧和技巧的文章。你也可以檢查出來(lái),找到你不知道的東西。

我們首先從Python的一些核心內(nèi)部開(kāi)始,你可以利用它來(lái)獲得優(yōu)勢(shì)。

基本的Python代碼優(yōu)化技巧和技巧的極客。

國(guó)際弦樂(lè)效率。

實(shí)現(xiàn)字符串是一種僅存儲(chǔ)每個(gè)不同字符串的單個(gè)副本的方法。我們可以通過(guò)操作我們的代碼來(lái)觸發(fā)字符串的實(shí)現(xiàn),使Python解釋器重用字符串。

通常,當(dāng)我們創(chuàng)建一個(gè)字符串對(duì)象時(shí),由Python解釋器決定是否緩存字符串。在處理標(biāo)識(shí)符的某些條件下,它是解釋器的固有本質(zhì)。

聲明一個(gè)字符串,其名稱(chēng)以字母或下劃線(xiàn)開(kāi)頭,僅包含字母/下劃線(xiàn)/數(shù)字組合,將使Python嵌入字符串并為其創(chuàng)建散列。

由于Python有很多使用字典的內(nèi)部代碼,這導(dǎo)致它執(zhí)行no。的搜索標(biāo)識(shí)符。因此,在標(biāo)識(shí)符串之間實(shí)行加速整個(gè)過(guò)程。簡(jiǎn)而言之,Python將所有標(biāo)識(shí)符保留在表中,并為每個(gè)對(duì)象生成唯一的密鑰(散列),以便將來(lái)查找。此優(yōu)化在編譯期間進(jìn)行。它還結(jié)合了類(lèi)似于標(biāo)識(shí)符的字符串文字的實(shí)習(xí)。

所以在Python中這是一個(gè)非常有用的功能,你可以利用它來(lái)獲得好處。這樣的功能可以幫助您加快對(duì)大型文本挖掘或分析應(yīng)用程序的處理。因?yàn)樗麄冃枰l繁的搜索和觸發(fā)信息的記賬。

您從文件中讀取或通過(guò)網(wǎng)絡(luò)通信接收的字符串不是Python中自動(dòng)實(shí)習(xí)的一部分。相反,您可以將此任務(wù)卸載到用于處理此類(lèi)字符串的intern()函數(shù)。

窺視孔優(yōu)化技術(shù)。

窺視孔優(yōu)化是從程序或程序的一部分優(yōu)化一小段指令的方法。這個(gè)段被稱(chēng)為<Peephole>或<Window>。它可以幫助您找到可以用最小化版本替換的說(shuō)明。

我們來(lái)看看Python如何處理窺視孔優(yōu)化。它有一個(gè)內(nèi)置的方法,從下面的例子中查看。

實(shí)施例-1。

該示例具有初始化其兩個(gè)成員的功能。其中一個(gè)是字符串,而另一個(gè)是整數(shù)。接下來(lái)的另一個(gè)代碼屬性被添加到函數(shù)中,并且默認(rèn)為<無(wú)>。有趣的是四個(gè)文字將作為常數(shù)留在記憶中。請(qǐng)參考下面給出的圖像。python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

Python代碼優(yōu)化提示和技巧 - 示例(1)

在附加的快照中,您可以看到我們使用了常量<.__代碼__。co_consts>。它是Python中每個(gè)功能對(duì)象的三個(gè)元組之一。是的,一個(gè)函數(shù)也是Python中的一個(gè)對(duì)象。它包括以下三個(gè)元組。

1. <__ code __。co_varnames>:保存包含參數(shù)的局部變量。

2. <__ code __。co_names>:存儲(chǔ)全局文字。

3. <__ code __。co_consts>:引用所有常量。

現(xiàn)在,窺探孔優(yōu)化可以做的更多,就是把可變結(jié)構(gòu)變成不可變的。參考下面的例子。

例2。

在這個(gè)例子中,我們使用“in”運(yùn)算符搜索集合中的一個(gè)特定元素。這里,Python會(huì)檢測(cè)到該集合將用于驗(yàn)證元素的成員資格。因此,無(wú)論集合的大小如何,它都會(huì)將指令視為不變成本操作。并且將比在元組或列表的情況下更快地處理它們。這種方法被稱(chēng)為Python中的成員身份測(cè)試。請(qǐng)仔細(xì)檢查附件的截圖。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

Python代碼優(yōu)化提示和技巧 - 示例(2)

實(shí)施例-3。

盡管如此,如果您以與上一個(gè)示例中的集合相似的方式使用列表對(duì)象,則Python將其轉(zhuǎn)換為元組常量?,F(xiàn)在,在這個(gè)例子中,我們已經(jīng)將這個(gè)集合和列表的用法結(jié)合在一起了。并顯示兩個(gè)對(duì)象都被轉(zhuǎn)換成常量。請(qǐng)參考附件截圖。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

Python代碼優(yōu)化技巧與竅門(mén) - 示例(3)

同樣的事實(shí),我們可以驗(yàn)證看翻譯代碼的字節(jié)碼。為此,我們必須導(dǎo)入Python的“dis”模塊。并將函數(shù)對(duì)象作為參數(shù)傳遞給“dis”構(gòu)造函數(shù),將按字節(jié)碼打印整個(gè)內(nèi)存布局。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

Python代碼優(yōu)化提示和技巧 - 示例(4)

從附件圖像中的“dis”輸出,很容易驗(yàn)證集合和列表是否已經(jīng)變?yōu)槌A俊?/p>

這里的主旨是Python只對(duì)文字進(jìn)行了這種轉(zhuǎn)換。如果上述示例中使用的任何set / list不是文字,那么優(yōu)化就不會(huì)發(fā)生。

配置你的代碼

在進(jìn)一步深入優(yōu)化您的代碼之前,如果您不知道瓶頸在哪里,那將是天真的。所以首先,使用下面提到的兩種方法中的任何一種來(lái)配置你的代碼。

3.1。使用<Timeit>進(jìn)行秒表分析。

這是使用Python的<timeit>模塊進(jìn)行分析的傳統(tǒng)方式。它記錄代碼段執(zhí)行的時(shí)間。它測(cè)量以毫秒為單位的時(shí)間。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

上面的例子表明,join方法比其他方法更有效率。

3.2。使用<CProfile>進(jìn)行高級(jí)分析。

從Python 2.5開(kāi)始,cProfile是Python包的一部分。它提供了一組不錯(cuò)的分析功能來(lái)隔離代碼中的瓶頸。你可以用許多方式與你的代碼綁定。喜歡,在其運(yùn)行方法中包裝一個(gè)函數(shù)來(lái)測(cè)量性能?;蛘?,在Python的“-m”選項(xiàng)的幫助下,通過(guò)命令行運(yùn)行整個(gè)腳本,同時(shí)激活cProfile作為參數(shù)。

在這里,我們將展示一些基本的例子,以便您了解如何使用它。

3.2.1。示例(1) - 在Python中使用CProfile。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

查看結(jié)果,您可以調(diào)查有待改進(jìn)的領(lǐng)域。更有用的是,我們可以在運(yùn)行腳本時(shí)附加cProfile。

3.2.2。示例(2) - 在Python中使用CProfile。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

3.2.3。如何解釋CProfile結(jié)果?

從分析結(jié)果中找出禍患更為重要。只有知道構(gòu)成cProfile報(bào)告的關(guān)鍵要素,才能作出決定。

1. <ncalls>:這是調(diào)用的次數(shù)。

2. <tottime>:這是在給定函數(shù)中花費(fèi)的總時(shí)間。

3. <percall>:表示<tottime>除以<ncalls>的商。

4. <cumtime>:執(zhí)行函數(shù)及其子功能的累積時(shí)間。

5. <percall>:表示<cumtime>除以原始調(diào)用的商。

6. <filename_lineno(function)>:程序中的操作點(diǎn)。這可能是一條線(xiàn)?;蛭募心硞€(gè)位置的函數(shù)。

現(xiàn)在,您已經(jīng)檢查了所有分析報(bào)告的元素。所以你可以去尋找程序的可能部分,在代碼中創(chuàng)建瓶頸。

首先,開(kāi)始檢查最重要的<tottime>和<cumtime>。有時(shí)候,<ncalls>也可能是相關(guān)的。對(duì)于其余的項(xiàng)目,您需要自己練習(xí)。

4.使用發(fā)電機(jī)和鑰匙進(jìn)行排序。

發(fā)電機(jī)是內(nèi)存優(yōu)化的好工具。它們有助于創(chuàng)建一次可以返回一個(gè)項(xiàng)目(迭代器)的函數(shù),而不是一次返回所有的項(xiàng)目。一個(gè)很好的例子是當(dāng)你創(chuàng)建一個(gè)巨大的數(shù)字列表,并將它們相加在一起。

此外,在列表中排序項(xiàng)目時(shí),應(yīng)盡可能使用鍵和默認(rèn)的<sort()>方法。在下面的示例中,檢查我們是否按照作為鍵參數(shù)的一部分選擇的索引對(duì)列表進(jìn)行排序。同樣的方法,你可以使用字符串。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

5.優(yōu)化循環(huán)。

大多數(shù)編程語(yǔ)言強(qiáng)調(diào)需要優(yōu)化循環(huán)。在Python中,我們確實(shí)有一種使循環(huán)執(zhí)行得更快的方法??紤]程序員經(jīng)常錯(cuò)過(guò)的方法是阻止在循環(huán)中使用點(diǎn)。

在Python中,您會(huì)看到一些支持循環(huán)的構(gòu)建塊。在這些少數(shù)中,使用“for”循環(huán)是普遍的。雖然你可能喜歡使用循環(huán),但是他們來(lái)代價(jià)。Python引擎在解釋for循環(huán)構(gòu)造方面付出了巨大的努力。因此,***用內(nèi)置的結(jié)構(gòu)(如地圖)替換它們。

接下來(lái),代碼優(yōu)化的水平也取決于你對(duì)Python內(nèi)置功能的了解。在下面的例子中,我們將嘗試解釋不同的構(gòu)造如何幫助優(yōu)化循環(huán)。

5.1。用于優(yōu)化Python中For循環(huán)的插圖。

實(shí)施例-1。

讓我們考慮一個(gè)更新Zipcodes列表的功能,剝離尾隨空格,并使用for循環(huán)。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

例2。

現(xiàn)在,看看如何使用地圖對(duì)象將上述內(nèi)容翻譯成單行。現(xiàn)在也更具成本效益。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

實(shí)施例-3。

我們甚至可以使用列表推導(dǎo)使語(yǔ)法更線(xiàn)性化。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

實(shí)施例-4。

***,最快的方法是將for循環(huán)轉(zhuǎn)換為生成器表達(dá)式。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

5.2。讓我們解碼我們優(yōu)化了什么?

如上所述,使用生成器表達(dá)式是在上述用例(通常)中優(yōu)化for循環(huán)的最快方法。我們分析了四個(gè)示例的代碼,以便您也可以看到每種方法獲得的性能提升。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

6.使用設(shè)置操作。

Python使用哈希表來(lái)管理集合。每當(dāng)我們向一個(gè)集合添加一個(gè)元素時(shí),Python解釋器將使用目標(biāo)元素的散列來(lái)確定其在為集合分配的內(nèi)存中的位置。

由于Python自動(dòng)調(diào)整散列表的大小,所以無(wú)論設(shè)置的大小如何,速度都可以是常數(shù)(O(1))。這就是集合操作執(zhí)行得更快。

在Python中,設(shè)置操作包括聯(lián)合,交集和差異。所以你可以嘗試在你的代碼中使用它們。這些通常比迭代列表快。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

7.避免使用全局變量。

它不僅限于Python,幾乎所有的語(yǔ)言都不允許使用全局變量的過(guò)度或計(jì)劃外使用。背后的原因是他們可能會(huì)隱藏/不明顯的副作用導(dǎo)致意大利面條代碼。此外,Python在訪(fǎng)問(wèn)外部變量方面真的很慢。

然而,它允許有限地使用全局變量。您可以使用global關(guān)鍵字聲明一個(gè)外部變量。另外,在使用它們的內(nèi)部循環(huán)之前做一個(gè)本地的副本。

8.使用外部庫(kù)/包。

一些python庫(kù)具有與原始庫(kù)相同特征的“C”等價(jià)物。被寫(xiě)入“C”使它們執(zhí)行速度更快。例如,嘗試使用cPickle而不是使用pickle。

接下來(lái),您可以使用<Cython>,這是Python的優(yōu)化靜態(tài)編譯器。它是Python的超集,并帶來(lái)C函數(shù)和類(lèi)型的支持。它指示編譯器生成快速高效的代碼。

您也可以考慮使用PyPy軟件包。它包括一個(gè)JIT(即時(shí))編譯器,使Python代碼運(yùn)行速度快。你甚至可以調(diào)整它來(lái)提供額外的處理能力。

9.使用內(nèi)置操作符。

Python是一種解釋型語(yǔ)言,基于高級(jí)抽象。所以你應(yīng)該盡可能使用內(nèi)置的。這將使您的代碼更有效率,因?yàn)閮?nèi)置的預(yù)編譯和快速。而包括解釋步驟在內(nèi)的漫長(zhǎng)迭代很慢。

同樣,喜歡使用內(nèi)置功能,如地圖,顯著改善速度。

10.在循環(huán)中限制方法查找。

在循環(huán)中工作時(shí),應(yīng)該緩存方法調(diào)用,而不是在對(duì)象上調(diào)用它。否則,方法查找是昂貴的。

請(qǐng)考慮以下示例。

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

python中的優(yōu)化,大神的程序比我們寫(xiě)的快五倍,原來(lái)是這樣做的!

11.使用字符串進(jìn)行優(yōu)化。

字符串連接緩慢,不要在循環(huán)中執(zhí)行。而是使用Python的join方法。或者,使用格式化功能來(lái)形成一個(gè)統(tǒng)一的字符串。

Python中的RegEx操作很快就被推回到C代碼。然而,在某些情況下,基本的字符串方法(如<isalpha()/ isdigit()/ startswith()/ endswith()>更好地工作。

此外,您可以使用<timeit>模塊測(cè)試不同的方法。它將幫助您確定哪種方法是真正最快的。

12.用If語(yǔ)句進(jìn)行優(yōu)化。

像大多數(shù)編程語(yǔ)言一樣,懶惰 - 如果評(píng)估,Python也是如此。這意味著,如果加入“AND”條件,那么并非所有條件都將被測(cè)試,以防其中一個(gè)變?yōu)榧佟?/p>

1.你可以調(diào)整你的代碼使用Python的這種行為。例如,如果要在列表中搜索固定模式,則可以通過(guò)添加以下條件來(lái)減小范圍。

如果目標(biāo)字符串的大小小于模式的長(zhǎng)度,則添加一個(gè)“AND”條件,該條件變?yōu)閒alse。

此外,您可以首先測(cè)試一個(gè)快速條件(如果有的話(huà)),如“string應(yīng)該以@開(kāi)頭”或“string應(yīng)該以點(diǎn)結(jié)尾”。

2.您可以測(cè)試比< > 更快的條件< not >。like ifdoneis None ifdone!=None

摘要 - Python代碼優(yōu)化提示和技巧。

我們希望本文中給出的方法可以幫助您構(gòu)建更快的Python應(yīng)用程序。但是,在應(yīng)用這些提示時(shí),請(qǐng)注意,只有在您的代碼中建立了灰色區(qū)域時(shí),才能進(jìn)行優(yōu)化。

您可以直接在編碼實(shí)踐中采用一些提示。就像使用剖析方法一樣,它們是給您正確的方向,并引導(dǎo)優(yōu)化的道路。

除了上述提示之外,您必須檢查代碼以進(jìn)行二次行為。您應(yīng)該了解不同Python構(gòu)造的時(shí)間復(fù)雜性,如列表,集合和集合。***,盡可能收集數(shù)據(jù),這將有助于您確定您正在做的是否對(duì)。

責(zé)任編輯:張燕妮 來(lái)源: python薔薇
相關(guān)推薦

2022-12-14 07:32:40

InnoDBMySQL引擎

2020-05-26 08:52:36

Java JVM多態(tài)

2024-02-06 09:30:25

Figma矩形矩形物理屬性

2022-05-05 08:55:12

工業(yè)物聯(lián)網(wǎng)IIoT

2023-05-22 15:58:11

2018-04-02 15:13:21

網(wǎng)絡(luò)

2024-04-30 08:22:51

Figma圖形編輯變換矩陣

2023-02-15 08:17:38

2025-02-17 09:22:16

MySQLSQL語(yǔ)句

2022-01-14 14:19:38

ReactTS前端

2016-10-12 08:54:24

2020-11-24 06:20:02

Linux日志文件系統(tǒng)

2020-03-23 08:30:12

程序員男友感受

2015-03-25 09:55:34

程序員程序員修補(bǔ)BUG真正原因

2020-04-26 14:11:23

報(bào)表工具python

2021-11-10 09:45:06

Lambda表達(dá)式語(yǔ)言

2021-08-17 07:00:00

雙重檢查鎖Nacos

2022-07-13 10:37:59

服務(wù)器故障優(yōu)化

2014-07-21 10:32:52

蘋(píng)果公司實(shí)習(xí)

2017-01-05 15:07:33

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)