亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

獨(dú)家 | 6種讓Python程序變慢的壞習(xí)慣

xcc3641 / 3169人閱讀

摘要:假設(shè)我們需要在程序中計(jì)算一些數(shù)字的平方根。此外如果我們需要在程序中多次使用平方根函數(shù),代碼將會(huì)更整潔。然而在這個(gè)虛構(gòu)的例子中,只有的年齡超過(guò)歲。然后檢查這三個(gè)人的年齡是否滿(mǎn)足第二個(gè)條件。

作者:?Christopher Tao翻譯:王可汗校對(duì):王雨桐本文約1800字,建議閱讀5分鐘本文總結(jié)了Python代碼中經(jīng)常被忽略的影響代碼的運(yùn)行速度常見(jiàn)問(wèn)題。

隨著Python的流行,用戶(hù)數(shù)量也在增加。Python確實(shí)相對(duì)容易上手,也非常靈活,因此有更多可能的方式來(lái)實(shí)現(xiàn)一個(gè)函數(shù)。

當(dāng)有多種方法可以實(shí)現(xiàn)一件特定的事情時(shí),這意味著每種方法都有優(yōu)缺點(diǎn)。在本文中,我收集了6種編寫(xiě)Python代碼的典型方法,這些方法可能導(dǎo)致相對(duì)較差的性能。

一、不導(dǎo)入根模塊

在使用Python時(shí),我們無(wú)法避免的一件事就是導(dǎo)入模塊,無(wú)論是內(nèi)置模塊還是第三方模塊。有時(shí)我們可能只需要其中的一個(gè)或幾個(gè)函數(shù)或?qū)ο?。在這種情況下,我們應(yīng)該只導(dǎo)入需要的函數(shù)或?qū)ο?,而不是?dǎo)入根模塊。

這里有一個(gè)簡(jiǎn)單的例子。假設(shè)我們需要在程序中計(jì)算一些數(shù)字的平方根。

低效率示范:

在這個(gè)錯(cuò)誤的示例中,我們導(dǎo)入了math模塊,并使用math.sqrt()訪(fǎng)問(wèn)該函數(shù)。當(dāng)然它可以運(yùn)行,但是如果我們直接導(dǎo)入sqrt()函數(shù),性能會(huì)更好。

高效率示范:

這比原來(lái)的快了25%。此外如果我們需要在程序中多次使用平方根函數(shù),代碼將會(huì)更整潔。

二、避免使用點(diǎn)/點(diǎn)鏈接

在Python中訪(fǎng)問(wèn)對(duì)象的屬性或函數(shù)時(shí),使用.是非常直觀(guān)的。這種方法大多數(shù)時(shí)候都沒(méi)有問(wèn)題。然而如果我們能夠避免使用點(diǎn)或點(diǎn)鏈接,那么性能便會(huì)變得更好。

低效率例子:

高效率例子:

如果你不相信它能起到同樣的作用,我們可以驗(yàn)證一下。

注意:我可以預(yù)料到許多Python開(kāi)發(fā)人員會(huì)跳出來(lái)說(shuō),這個(gè)例子中的技術(shù)有點(diǎn)可笑。事實(shí)上即使是我自己,也很少像上面那樣寫(xiě)代碼。然而我們應(yīng)該知道怎樣的代碼是更高效的,可以使實(shí)現(xiàn)更快。

如果我們想要添加列表并從列表中移除項(xiàng)目,我們應(yīng)該考慮使用這個(gè)技巧。這就是為什么我們需要平衡代碼的性能和可讀性。

三、不使用+連接字符串

字符串在Python中是不可變的。因此當(dāng)我們使用“+”將多個(gè)字符串連接成一個(gè)長(zhǎng)字符串時(shí),每個(gè)子字符串都是多帶帶操作的。

低效率例子:

具體來(lái)說(shuō),對(duì)于每個(gè)子字符串,它需要請(qǐng)求一個(gè)內(nèi)存地址,然后將它與該內(nèi)存地址中的原始字符串連接起來(lái)。這就產(chǎn)生了一種開(kāi)銷(xiāo)。

高效率例子:

然而當(dāng)我們使用join()函數(shù)時(shí),該函數(shù)事先知道所有子字符串,并根據(jù)最終的字符串長(zhǎng)度分配內(nèi)存地址。因此省去了為每個(gè)子字符串分配內(nèi)存的開(kāi)銷(xiāo)。

注意點(diǎn):強(qiáng)烈建議盡可能多地使用join()函數(shù)。然而,有時(shí)我們可能只想連接兩個(gè)字符串?;蛘咧皇菫榱朔奖闫鹨?jiàn),我們想使用“+”。在這些情況下,使用“+”號(hào)可以獲得更好的可讀性和更短的代碼長(zhǎng)度。

四、不使用臨時(shí)變量進(jìn)行值交換

許多算法需要兩個(gè)變量的值交換。在大多數(shù)其他編程語(yǔ)言中,通常要引入一個(gè)臨時(shí)變量來(lái)實(shí)現(xiàn),如下所示。

低效率示范:

很明顯我們需要一個(gè)臨時(shí)變量作為過(guò)渡。當(dāng)變量b的值被傳遞給變量a時(shí),它用于保存變量a的值,然后a的值可以被賦給變量b。

高效率示范:

然而在Python中,我們不需要使用臨時(shí)變量。Python有如下內(nèi)置語(yǔ)法來(lái)實(shí)現(xiàn)這個(gè)值交換。這不僅提升了效率,而且使代碼更加整潔。

五、在if條件下使用短路邏輯(short-circuit)

短路計(jì)算在許多編程語(yǔ)言中都存在,Python也是如此。它指的是一些布爾運(yùn)算符的計(jì)算邏輯,只有在第一個(gè)參數(shù)不足以確定整個(gè)表達(dá)式的值時(shí),才執(zhí)行或計(jì)算第二個(gè)參數(shù)。讓我們用一個(gè)例子來(lái)演示。假設(shè)我們有如下列表。

my_dict = [    {        "name": "Alice",        "age": 28    },    {        "name": "Bob",        "age": 23    },    {        "name": "Chris",        "age": 33    },    {        "name": "Chelsea",        "age": 2    },    {        "name": "Carol",        "age": 24    }]

我們的工作是篩選名單,找出姓名以“C”開(kāi)頭、年齡在30歲以上的所有人。

低效率示范:

有兩個(gè)條件都需要滿(mǎn)足:

  • 名字以“C”開(kāi)頭

  • 年齡≥30歲

我們可以這樣寫(xiě)代碼。

高效率示范:

前面示例中的代碼沒(méi)有任何錯(cuò)誤。然而在這個(gè)虛構(gòu)的例子中,只有“Chris”的年齡超過(guò)30歲。

因此如果我們先寫(xiě)出檢查名字的條件,則滿(mǎn)足了3個(gè)名字(Chris, Chelsea, Carol)。然后檢查這三個(gè)人的年齡是否滿(mǎn)足第二個(gè)條件。

但是由于短路邏輯,如果我們先寫(xiě)年齡條件,只有Chris的年齡在30歲以上,我們會(huì)再次檢查他的名字是否以“C”開(kāi)頭。

在這種情況下,它幾乎快了100%。

六、如果可以使用for循環(huán),就不要使用while循環(huán)

Python使用大量C語(yǔ)言來(lái)提高性能,即CPython。在循環(huán)語(yǔ)句方面,與while循環(huán)相比,Python中的for循環(huán)有相對(duì)較少的步驟,而更多的步驟是作為C代碼運(yùn)行的。

因此當(dāng)我們可以在Python中使用for循環(huán)時(shí),盡量避免使用while循環(huán)。這不僅是因?yàn)樵赑ython中for循環(huán)更優(yōu)雅,而且性能更好。

低效率示范:

高效率示范:

總結(jié)

在本文中,我列出了6個(gè)可以使Python程序更快的技巧。但是我們也需要特別注意的是,我們不應(yīng)該總是把性能放在第一位。有時(shí)可讀性和簡(jiǎn)潔性也應(yīng)該考慮在內(nèi),這一切最重要的是平衡。

原文標(biāo)題:

Six Bad Manners that Make YourPython Program Slower

原文鏈接:

https://towardsdatascience.com/6-bad-manners-makes-your-python-program-slower-15b6fce62927

編輯:黃繼彥

譯者簡(jiǎn)介

王可汗,清華大學(xué)機(jī)械工程系直博生在讀。曾經(jīng)有著物理專(zhuān)業(yè)的知識(shí)背景,研究生期間對(duì)數(shù)據(jù)科學(xué)產(chǎn)生濃厚興趣,對(duì)機(jī)器學(xué)習(xí)AI充滿(mǎn)好奇。期待著在科研道路上,人工智能與機(jī)械工程、計(jì)算物理碰撞出別樣的火花。希望結(jié)交朋友分享更多數(shù)據(jù)科學(xué)的故事,用數(shù)據(jù)科學(xué)的思維看待世界。

翻譯組招募信息

工作內(nèi)容:需要一顆細(xì)致的心,將選取好的外文文章翻譯成流暢的中文。如果你是數(shù)據(jù)科學(xué)/統(tǒng)計(jì)學(xué)/計(jì)算機(jī)類(lèi)的留學(xué)生,或在海外從事相關(guān)工作,或?qū)ψ约和庹Z(yǔ)水平有信心的朋友歡迎加入翻譯小組。

你能得到:定期的翻譯培訓(xùn)提高志愿者的翻譯水平,提高對(duì)于數(shù)據(jù)科學(xué)前沿的認(rèn)知,海外的朋友可以和國(guó)內(nèi)技術(shù)應(yīng)用發(fā)展保持聯(lián)系,THU數(shù)據(jù)派產(chǎn)學(xué)研的背景為志愿者帶來(lái)好的發(fā)展機(jī)遇。

其他福利:來(lái)自于名企的數(shù)據(jù)科學(xué)工作者,北大清華以及海外等名校學(xué)生他們都將成為你在翻譯小組的伙伴。

點(diǎn)擊文末“閱讀原文”加入數(shù)據(jù)派團(tuán)隊(duì)~

轉(zhuǎn)載須知

如需轉(zhuǎn)載,請(qǐng)?jiān)陂_(kāi)篇顯著位置注明作者和出處(轉(zhuǎn)自:數(shù)據(jù)派ID:DatapiTHU),并在文章結(jié)尾放置數(shù)據(jù)派醒目二維碼。有原創(chuàng)標(biāo)識(shí)文章,請(qǐng)發(fā)送【文章名稱(chēng)-待授權(quán)公眾號(hào)名稱(chēng)及ID】至聯(lián)系郵箱,申請(qǐng)白名單授權(quán)并按要求編輯。

發(fā)布后請(qǐng)將鏈接反饋至聯(lián)系郵箱(見(jiàn)下方)。未經(jīng)許可的轉(zhuǎn)載以及改編者,我們將依法追究其法律責(zé)任。

點(diǎn)擊“閱讀原文”擁抱組織

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/121153.html

相關(guān)文章

  • SQL查詢(xún)慢的原因及50條優(yōu)化方法總結(jié)

    摘要:沒(méi)有創(chuàng)建計(jì)算列導(dǎo)致查詢(xún)不優(yōu)化。配置虛擬內(nèi)存虛擬內(nèi)存大小應(yīng)基于計(jì)算機(jī)上并發(fā)運(yùn)行的服務(wù)進(jìn)行配置。運(yùn)行時(shí),可考慮將虛擬內(nèi)存大小設(shè)置為計(jì)算機(jī)中安裝的物理內(nèi)存的倍。用查詢(xún)優(yōu)化器可見(jiàn)到差別。一、查詢(xún)速度慢的原因很多,我總結(jié)SQL查詢(xún)慢的10個(gè)原因:  1、沒(méi)有索引或者沒(méi)有用到索引(這是查詢(xún)慢最常見(jiàn)的問(wèn)題,是程序設(shè)計(jì)的缺陷)  2、I/O吞吐量小,形成了瓶頸效應(yīng)?! ?、沒(méi)有創(chuàng)建計(jì)算列導(dǎo)致查詢(xún)不優(yōu)化。  ...

    Tecode 評(píng)論0 收藏0
  • 我的前端編碼習(xí)慣 —— js篇

    摘要:文件中的代碼塊可用以下代碼塊包裹,以減少全局污染。命名規(guī)則原則盡量避免潛在命名沖突,避免過(guò)于精簡(jiǎn),應(yīng)見(jiàn)名知意。必須與共同使用的構(gòu)造函數(shù)名應(yīng)以大寫(xiě)字母開(kāi)頭。變量所有的變量必須在使用前進(jìn)行聲明。僅在函數(shù)和構(gòu)造器內(nèi)使,以明確的上下指向。 代碼格式規(guī)范 1.html中外部腳本引入盡量放在尾部。 2.一個(gè)html文件中只寫(xiě)一個(gè)代碼塊。 3.JS文件中的代碼塊可用以下代碼塊包裹,以減少全局污染。 ...

    LancerComet 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<