色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是常量折疊?Python如何優雅地實現它

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-10-30 11:10 ? 次閱讀

每種編程語言為了表現出色,并且實現卓越的性能,都需要大量編譯器級的優化。

一種著名的優化技術是“常量折疊”(Constant Folding):在編譯期間,編譯器會設法識別出常量表達式,對其進行求值,然后用求值的結果來替換表達式,從而使得運行時更精簡。

在本文中,我們深入探討了什么是常量折疊,了解了它在 Python 世界中的適用范圍,最后解讀了 Python 的源代碼(即 CPython),并分析出 Python 是如何優雅地實現它。

常量折疊

所謂常量折疊,指的是在編譯時就查找并計算常量表達式,而不是在運行時再對其進行計算,從而會使運行時更加精簡和快速。

>> > day_sec = 24 * 60 * 60

當編譯器遇到一個常量表達式時,如上所述,它將對表達式求值,并作替換。

通常而言,表達式會被“抽象語法樹”( Abstract Syntax Tree,簡寫為 AST)中的計算值所替換,但是這完全取決于語言的實現。

因此,上述表達式可以等效地被執行為:

>> > day_sec = 86400

Python 中的常量折疊

在 Python 中,我們可以使用匯編模塊(Disassembler)獲取 CPython 字節碼,從而更好地了解代碼執行的過程。

當使用dis模塊反匯編上述常量表達式時,我們會得到以下字節碼:

>> > import dis
 >> > dis.dis("day_sec = 24 * 60 * 60")

        0 LOAD_CONST               0 (86400)
        2 STORE_NAME               0 (day_sec)
        4 LOAD_CONST               1 (None)
        6 RETURN_VALUE

從字節碼中可以看出,它只有一個LOAD_CONST ,以及一個已經計算好的值86400

這表明 CPython 解釋器在解析和構建抽象語法樹期間,會折疊常量表達式 24 * 60 * 60,并將其替換為計算值 86400。

常量折疊的適應范圍

Python 會嘗試折疊每一個常量表達式,但在某些情況下,即使該表達式是常量,但是 Python 并不會對其進行折疊。

例如,Python 不會折疊x = 4 ** 64,但會折疊 x = 2 ** 64

圖片

除了算術表達式,Python 還會折疊涉及字符串和元組的表達式,其中,長度不超過 4096 的字符串常量表達式會被折疊。

>> > a = "-" * 4096   # folded
 >> > a = "-" * 4097   # not folded
 >> > a = "--" * 4096  # not folded

常量折疊的內部細節

現在,我們將重點轉移到內部的實現細節,即關注 CPython 在哪里以及如何實現常量折疊。

所有的 AST 優化(包括常量折疊)都可以在 ast_opt.c 文件中找到。基本的開始函數是 astfold_expr,它會折疊 Python 源碼中包含的所有表達式。

這個函數以遞歸方式遍歷 AST,并試著折疊每個常量表達式,如下面的代碼片段所示:

圖片

astfold_expr 在折疊某個表達式之前,會嘗試折疊其子表達式(操作對象),然后將折疊操作代理給特定的表達式折疊函數。

特定操作的折疊函數對表達式求值,并返回計算后的常數,然后將其放入 AST 中。

例如,每當 astfold_expr 遇到二值運算時,它便調用 fold_binop,遞歸地計算兩個子操作對象(表達式) 。

fold_binop 函數返回計算后的常量值,如下面的代碼片段所示:

圖片

fold_binop 函數通過檢查當前運算符的種類,然后調用其相應的處理函數來折疊二值運算。例如,如果當前的操作是加法運算,為了計算最終值,它會對其左側和右側操作數調用 PyNumber_Add。

怎樣優雅?

為了有效地折疊某些模式或類型的常量表達式,CPython 不會寫特殊的邏輯,而是調用相同的通用代碼。例如,在折疊時,它會調用通用的 PyNumber_Add 函數,跟執行常規的加法操作一樣。

因此,CPython 通過確保其通用代碼/計算過程可以處理常量表達式的求值,從而消除了編寫特殊函數來處理常量折疊的需要。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2696

    瀏覽量

    47436
  • 字符串
    +關注

    關注

    1

    文章

    578

    瀏覽量

    20508
  • 編譯器
    +關注

    關注

    1

    文章

    1624

    瀏覽量

    49109
  • python
    +關注

    關注

    56

    文章

    4793

    瀏覽量

    84631
收藏 人收藏

    評論

    相關推薦

    折疊匹配濾波器的實現

    折疊匹配率波器的實現過程
    發表于 10-16 16:47

    【AI學習】第4篇--Python編輯入門

    Python是一種流行的計算機程序語言,在當今的AI科技潮流下,顯得更搶眼,因為在AI科學領域的許多鏈接庫、以及相關的框架(Framework)或平臺(Platform)都是Python作為
    發表于 11-03 10:18

    2.1 python常量與變量

    2.1 python常量與變量變量:在程序運行過程中,值會發生變化的量常量:在程序運行過程中,值不會發生變化的量無論是變量還是常量,在創建時都會在內存中開辟一塊空間,用于保存
    發表于 02-16 18:34

    Python常量與變量基礎知識詳解

    Python是一門強類型的動態語言。 字面常量,變量沒有類型,變量只是在特定的時間指向特定的對象而已,變量所指向的對象是有類型的。 變量:變量在賦值時被創建,它可以是任何對象的引用,但必須在引用前被
    發表于 12-14 05:31 ?1814次閱讀

    讓你的 Python 代碼優雅又地道

    Python社區文化的澆灌下,演化出了一種獨特的代碼風格,去指導如何正確地使用Python,這就是常說的pythonic。一般說地道(idiomatic)的python代碼,就是指這份代碼很
    的頭像 發表于 03-06 10:35 ?3620次閱讀

    python基礎教程之python入門教程中文手冊免費下載

    Python是一種容易學習的強大語言。包括了高效的高級數據結構,提供了一個簡單但很有效的方式進行面向對象編程。Python 優雅的語法,動態類型,以及
    發表于 08-29 08:00 ?31次下載

    Python入門之Python基礎教程資料免費下載

    Python 是種易學而強大的編程語言 。 包含了高效的高級數據結構 , 能夠用簡單而高效的方式進行面向對象編程 。 Python 優雅的語法和動態類型, 以及
    發表于 10-16 08:00 ?39次下載

    Python學習手冊免費下載

    Python 是一種容易學習的強大語言。包括了高效的高級數據結構,提供了一個簡單但很有有效的方式以便進行面向對象編程。Python 優雅的語法,動態數據類型,以及
    發表于 03-01 16:12 ?9次下載
    <b class='flag-5'>Python</b>學習手冊免費下載

    Python學習手冊免費下載

    Python 是一種容易學習的強大語言。包括了高效的高級數據結構,提供了一個簡單但很有有效的方式以便進行面向對象編程。Python 優雅的語法,動態數據類型,以及
    發表于 03-01 16:12 ?26次下載
    <b class='flag-5'>Python</b>學習手冊免費下載

    Python優雅的日志記錄解決方案Loguru

    ? Loguru: 更優雅的日志記錄解決方案! loguru ?是一個? Python ?簡易且強大的第三方日志記錄庫,該庫旨在通過添加一系列有用的功能來解決標準記錄器的注意事項,從而減少
    的頭像 發表于 11-18 11:24 ?2989次閱讀

    深入了解python常量與變量

      Python 的變量和常量不需要事先聲明類型,這是根據Python的動態語言特性而來。
    的頭像 發表于 02-16 18:22 ?1916次閱讀
    深入了解<b class='flag-5'>python</b><b class='flag-5'>常量</b>與變量

    Python實現所有算法-基本牛頓法

    Python實現所有算法-二分法 Python實現所有算法-力系統是否靜態平衡 Python實現
    的頭像 發表于 07-13 10:40 ?1641次閱讀

    淺談指針常量常量指針

    這節課我們來講一講指針常量常量指針。
    的頭像 發表于 02-21 09:27 ?1073次閱讀

    Python優雅之處:Descriptor(描述符)

    語法糖的實現上也有使用到(在下面的文章會一一介紹)。 當你點進這篇文章時 你也許沒學過描述符,甚至沒聽過描述符。 或者你對描述符只是一知半解 無論你是哪種,本篇都將帶你全面的學習描述符,一起來感受 Python 語言的優雅。 1
    的頭像 發表于 11-02 10:52 ?998次閱讀
    <b class='flag-5'>Python</b>的<b class='flag-5'>優雅</b>之處:Descriptor(描述符)

    python語言特點有哪些

    Python是一種高級編程語言,由Guido van Rossum于1991年首次發布。具有許多獨特的特點,這些特點使得Python在軟件開發領域變得非常流行。以下是關于Python
    的頭像 發表于 11-29 14:29 ?1135次閱讀
    主站蜘蛛池模板: 菠萝菠萝蜜视频在线看1| 老阿姨才是最有味的一区二区| 2018久久视频在线视频观看| 欧美色图天堂网| 狠狠色狠狠色狠狠五月ady| 99久久免费精品国产| 亚洲国产果果在线播放在线| 欧美在线视频一区| 老师紧窄粉嫩| 精品一区二区三区四区五区六区| 丰满女朋友在线观看中文| 91popny蜜桃臀| 亚洲免费在线观看视频| 让男人玩尿道的女人| 久久99影院| 国产色婷亚洲99精品AV在线| 抽插内射高潮呻吟V杜V| 4480YY无码午夜私人影院| 亚洲三级黄色片| 亚洲午夜精品A片久久WWW解说| 亚洲粉嫩美白在线| 亚洲 欧洲 国产 日产 综合| 无人区在线日本高清免费| 色色色999| 四虎永久免费| 日韩人妻精品久久日| 四房播播开心色播| 午夜十八岁禁| 一久久| 99精品国产AV一区二区麻豆| 99久久免费看少妇高潮A片| 扒开腿狂躁女人GIF动态图| 嘟嘟嘟在线视频免费观看高清中文| 成人国产一区| 国产在线一区观看| 久久理论片迅播影院一级| 麻豆AV蜜桃AV久久| 乳液全集电影在线观看| 亚洲精品无码久久久久A片| 607080老太太AW| 高清视频在线观看SEYEYE|