<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 3024字,需瀏覽 7分鐘

           ·

          2021-09-26 11:54

          作者: Christopher Tao

          翻譯:王可汗

          校對:王雨桐


          本文約1800字,建議閱讀5分鐘

          本文總結(jié)了Python代碼中經(jīng)常被忽略的影響代碼的運行速度常見問題。


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

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

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

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

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

          低效率示范:


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

          高效率示范:


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

          二、避免使用點/點鏈接

          在Python中訪問對象的屬性或函數(shù)時,使用.是非常直觀的。這種方法大多數(shù)時候都沒有問題。然而如果我們能夠避免使用點或點鏈接,那么性能便會變得更好。

          低效率例子:


          高效率例子:


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

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

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

          三、不使用+連接字符串

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

          低效率例子:


          具體來說,對于每個子字符串,它需要請求一個內(nèi)存地址,然后將它與該內(nèi)存地址中的原始字符串連接起來。這就產(chǎn)生了一種開銷。

          高效率例子:


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

          注意點:強烈建議盡可能多地使用join()函數(shù)。然而,有時我們可能只想連接兩個字符串。或者只是為了方便起見,我們想使用“+”。在這些情況下,使用“+”號可以獲得更好的可讀性和更短的代碼長度。

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

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

          低效率示范:


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

          高效率示范:

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


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

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

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

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

          低效率示范:

          有兩個條件都需要滿足:

          • 名字以“C”開頭

          • 年齡≥30歲


          我們可以這樣寫代碼。


          高效率示范:

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

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

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


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

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

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

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

          低效率示范:


          高效率示范:


          總結(jié)

          在本文中,我列出了6個可以使Python程序更快的技巧。但是我們也需要特別注意的是,我們不應(yīng)該總是把性能放在第一位。有時可讀性和簡潔性也應(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

          編輯:黃繼彥




          譯者簡介






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

          翻譯組招募信息

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

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

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


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



          轉(zhuǎn)載須知

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

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



          點擊“閱讀原文”擁抱組織



          瀏覽 68
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一区二区三区四区无码视频 | 国产精品porn | 日本成人一级A片 | 操逼视频大全 | 国产三四区,婷婷 |