最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Cpython3.9源碼解析python中的大小整數(shù)

 更新時(shí)間:2023年04月21日 10:14:09   作者:菜鳥(niǎo)小超  
這篇文章主要介紹了Cpython3.9源碼解析python中的大小整數(shù),在CPython中,小整數(shù)對(duì)象池是一種優(yōu)化機(jī)制,用于減少對(duì)常用小整數(shù)的內(nèi)存分配和銷毀開(kāi)銷,需要的朋友可以參考下

小整數(shù)

/* interpreter state */

#define _PY_NSMALLPOSINTS           257
#define _PY_NSMALLNEGINTS           5

這是CPython中定義的兩個(gè)常量,它們用于控制解釋器狀態(tài)中的小整數(shù)對(duì)象池。在CPython中,小整數(shù)對(duì)象池是一種優(yōu)化機(jī)制,用于減少對(duì)常用小整數(shù)的內(nèi)存分配和銷毀開(kāi)銷。

_PY_NSMALLPOSINTS定義了正小整數(shù)對(duì)象池的大小。在這里,其值設(shè)置為257,表示解釋器將為從0到256(包含0和256)的整數(shù)預(yù)分配對(duì)象并緩存。這些整數(shù)在很多場(chǎng)景下會(huì)被頻繁使用,所以事先創(chuàng)建并緩存它們可以提高性能。

_PY_NSMALLNEGINTS定義了負(fù)小整數(shù)對(duì)象池的大小。在這里,其值設(shè)置為5,表示解釋器將為從-1到-5(包含-1和-5)的整數(shù)預(yù)分配對(duì)象并緩存。

在Python解釋器啟動(dòng)時(shí),這些小整數(shù)對(duì)象會(huì)被創(chuàng)建并放入對(duì)象池。當(dāng)需要這些整數(shù)值時(shí),解釋器會(huì)直接從對(duì)象池中獲取對(duì)應(yīng)的對(duì)象,而不是動(dòng)態(tài)創(chuàng)建新對(duì)象。這樣,對(duì)于這些小整數(shù)值的操作可以更快地進(jìn)行,節(jié)省了內(nèi)存分配和銷毀的開(kāi)銷。

static PyObject *
get_small_int(sdigit ival)
{
    assert(IS_SMALL_INT(ival));
    PyThreadState *tstate = _PyThreadState_GET();
    PyObject *v = (PyObject*)tstate->interp->small_ints[ival + NSMALLNEGINTS];
    Py_INCREF(v);
    return v;
}

typedef int32_t sdigit; /* signed variant of digit */

#define IS_SMALL_INT(ival) (-NSMALLNEGINTS <= (ival) && (ival) < NSMALLPOSINTS)

這是get_small_int函數(shù)的實(shí)現(xiàn),它用于從小整數(shù)對(duì)象池中獲取一個(gè)指定值的小整數(shù)對(duì)象。小整數(shù)對(duì)象池包含了一定范圍內(nèi)的整數(shù)對(duì)象,主要是為了避免對(duì)這些常用的整數(shù)對(duì)象進(jìn)行頻繁的內(nèi)存分配和銷毀。

get_small_int函數(shù)接受一個(gè)sdigit類型的參數(shù)ival,表示要獲取的整數(shù)值。在函數(shù)內(nèi)部,首先使用assert(IS_SMALL_INT(ival))確保傳入的整數(shù)值ival在小整數(shù)對(duì)象池的范圍內(nèi)。

接下來(lái),函數(shù)獲取當(dāng)前線程狀態(tài)(PyThreadState)并從其中獲取解釋器狀態(tài)(tstate->interp)。解釋器狀態(tài)包含了小整數(shù)對(duì)象池,即small_ints數(shù)組

然后,根據(jù)ival計(jì)算出在small_ints數(shù)組中的索引(ival + NSMALLNEGINTS),并將對(duì)應(yīng)位置的對(duì)象賦值給v。NSMALLNEGINTS是一個(gè)宏定義,表示負(fù)小整數(shù)的個(gè)數(shù)。假設(shè)我們有一個(gè)整數(shù)值 ival,我們想要在 small_ints 數(shù)組中查找這個(gè)值對(duì)應(yīng)的預(yù)分配的小整數(shù)對(duì)象。NSMALLNEGINTS 是預(yù)分配的負(fù)數(shù)的數(shù)量。在 CPython 中,NSMALLNEGINTS 的值通常為5,表示有5個(gè)預(yù)分配的負(fù)整數(shù)對(duì)象(-1, -2, -3, -4, -5)。

現(xiàn)在,我們將通過(guò)計(jì)算 ival + NSMALLNEGINTS 來(lái)找到 small_ints 數(shù)組中的索引。例如,假設(shè) ival 為3。那么,我們可以計(jì)算索引如下:

index = ival + NSMALLNEGINTS
index = 3 + 5
index = 8

這意味著 small_ints 數(shù)組中的第8個(gè)元素(從0開(kāi)始計(jì)數(shù))是我們要查找的整數(shù)對(duì)象。在這個(gè)例子中,我們將找到預(yù)分配的小整數(shù)對(duì)象3,并將其引用計(jì)數(shù)加1,然后返回這個(gè)對(duì)象。

接下來(lái),通過(guò)調(diào)用Py_INCREF(v)增加v的引用計(jì)數(shù),以防止對(duì)象在其引用計(jì)數(shù)變?yōu)?時(shí)被錯(cuò)誤地回收。

最后,返回指向小整數(shù)對(duì)象的指針v。

總之,get_small_int函數(shù)的作用是從小整數(shù)對(duì)象池中獲取一個(gè)指定值的小整數(shù)對(duì)象,并增加其引用計(jì)數(shù),然后返回該對(duì)象。這樣可以提高對(duì)常用小整數(shù)的操作性能。

大整數(shù)

/* Long integer representation.
   The absolute value of a number is equal to
        SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
   Negative numbers are represented with ob_size < 0;
   zero is represented by ob_size == 0.
   In a normalized number, ob_digit[abs(ob_size)-1] (the most significant
   digit) is never zero.  Also, in all cases, for all valid i,
        0 <= ob_digit[i] <= MASK.
   The allocation function takes care of allocating extra memory
   so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.

   CAUTION:  Generic code manipulating subtypes of PyVarObject has to
   aware that ints abuse  ob_size's sign bit.
*/

這是CPython源碼中關(guān)于長(zhǎng)整數(shù)表示的一段注釋。它解釋了PyLongObject如何表示大整數(shù)的絕對(duì)值和符號(hào)。讓我們逐行分析這個(gè)注釋:

1.首先,注釋指出大整數(shù)的絕對(duì)值等于:

SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)

ob_digit表示長(zhǎng)整數(shù)的每個(gè)“數(shù)字”,SHIFT是每個(gè)“數(shù)字”的位數(shù),通常為30或15。ob_size表示長(zhǎng)整數(shù)的符號(hào)和長(zhǎng)度,它的絕對(duì)值表示長(zhǎng)整數(shù)的長(zhǎng)度,即“數(shù)字”的個(gè)數(shù)。

2.對(duì)于負(fù)數(shù),ob_size小于0。對(duì)于0,ob_size等于0。

3.在規(guī)范化的數(shù)中,最高有效位(即最高“數(shù)字”)永遠(yuǎn)不會(huì)為零。此外,在所有情況下,對(duì)于所有有效的i,ob_digit[i]的取值范圍在0到MASK之間。MASK的值通常為(1 << PyLong_SHIFT) - 1,即2**PyLong_SHIFT - 1

4.注釋還提到分配函數(shù)負(fù)責(zé)分配額外的內(nèi)存,以確保ob_digit[0]ob_digit[abs(ob_size)-1]實(shí)際上是可用的。

5.最后,注釋中的“警告”部分提醒開(kāi)發(fā)者,操縱PyVarObject子類型的通用代碼需要注意整數(shù)會(huì)濫用ob_size的符號(hào)位。這是因?yàn)?code>ob_size的符號(hào)位同時(shí)表示整數(shù)的長(zhǎng)度和符號(hào),而通常情況下ob_size僅用于表示長(zhǎng)度。

額外解釋

ob_digit 是一個(gè)表示大整數(shù)中每個(gè) “數(shù)字” 的數(shù)組,它是一個(gè)整數(shù)數(shù)組,用于表示長(zhǎng)整數(shù)對(duì)象(PyLongObject)中的整數(shù)值。每個(gè) “數(shù)字” 都有一個(gè)固定的位數(shù),由 PyLong_SHIFT 定義(通常為 30 或 15)。例如,假設(shè)我們有一個(gè)長(zhǎng)整數(shù)對(duì)象,其值為 12345678901234567890。

在這個(gè)例子中,假設(shè) PyLong_SHIFT 為 30,這意味著每個(gè) “數(shù)字” 可以表示 2^30 = 1073741824 個(gè)不同的值。為了將這個(gè)大整數(shù)表示為 ob_digit 數(shù)組,我們需要將整數(shù)拆分為基于 2^30 的 “數(shù)字”。在這種情況下,我們可以將整數(shù)表示為:

12345678901234567890 = 4 * 2^(30*2) + 726238597 * 2^(30*1) + 1026062870 * 2^(30*0)

所以,ob_digit 數(shù)組將包含以下元素:

ob_digit[0] = 1026062870
ob_digit[1] = 726238597
ob_digit[2] = 4

在實(shí)際的 CPython 源碼中,PyLongObject 的定義如下:

typedef struct {
    PyObject_VAR_HEAD
    digit ob_digit[1];
} PyLongObject;

在這里,ob_digit 是一個(gè)長(zhǎng)度為1的數(shù)組,但實(shí)際上,它是一個(gè)可變長(zhǎng)度數(shù)組,根據(jù)所需的 “數(shù)字” 數(shù)量動(dòng)態(tài)分配。要注意的是,當(dāng)一個(gè) PyLongObject 被創(chuàng)建時(shí),會(huì)根據(jù)整數(shù)值的大小動(dòng)態(tài)分配適當(dāng)數(shù)量的空間來(lái)存儲(chǔ) ob_digit 數(shù)組。

總之,ob_digit 是一個(gè)整數(shù)數(shù)組,用于表示長(zhǎng)整數(shù)對(duì)象中的大整數(shù)值。每個(gè)數(shù)組元素都是一個(gè) “數(shù)字”,具有固定的位數(shù)。這種表示方法使得 CPython 能夠有效地存儲(chǔ)和處理大整數(shù)。

到此這篇關(guān)于Cpython3.9源碼解析python中的大小整數(shù)的文章就介紹到這了,更多相關(guān)Cpython3.9源碼解析大小整數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Python實(shí)現(xiàn)下載并保存網(wǎng)絡(luò)圖片

    使用Python實(shí)現(xiàn)下載并保存網(wǎng)絡(luò)圖片

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)下載并保存網(wǎng)絡(luò)圖片,不需要有編程經(jīng)驗(yàn),本文將以最簡(jiǎn)單的方式一步步教你完成,快了跟隨小編一起學(xué)習(xí)一下吧
    2024-12-12
  • tensorflow模型轉(zhuǎn)ncnn的操作方式

    tensorflow模型轉(zhuǎn)ncnn的操作方式

    這篇文章主要介紹了tensorflow模型轉(zhuǎn)ncnn的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • Python實(shí)現(xiàn)多維數(shù)據(jù)分析的示例詳解

    Python實(shí)現(xiàn)多維數(shù)據(jù)分析的示例詳解

    多維數(shù)據(jù)分析是對(duì)數(shù)據(jù)的信息分析,它考慮了許多關(guān)系,這篇文章主要為大家詳細(xì)介紹了一些使用Python分析多維/多變量數(shù)據(jù)的基本技術(shù),希望對(duì)大家有所幫助
    2023-11-11
  • Python爬蟲(chóng)中IP池的使用小結(jié)

    Python爬蟲(chóng)中IP池的使用小結(jié)

    在網(wǎng)絡(luò)爬蟲(chóng)的世界中,IP池是一個(gè)關(guān)鍵的概念,它允許爬蟲(chóng)程序在請(qǐng)求網(wǎng)頁(yè)時(shí)使用多個(gè)IP地址,從而降低被封禁的風(fēng)險(xiǎn),提高爬蟲(chóng)的穩(wěn)定性和效率,本文將深入探討Python爬蟲(chóng)中IP池的使用,以及如何構(gòu)建和維護(hù)一個(gè)可靠的IP池,感興趣的朋友一起看看吧
    2024-01-01
  • 基于keras中訓(xùn)練數(shù)據(jù)的幾種方式對(duì)比(fit和fit_generator)

    基于keras中訓(xùn)練數(shù)據(jù)的幾種方式對(duì)比(fit和fit_generator)

    這篇文章主要介紹了keras中訓(xùn)練數(shù)據(jù)的幾種方式對(duì)比(fit和fit_generator),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 解讀torch.nn.GRU的輸入及輸出示例

    解讀torch.nn.GRU的輸入及輸出示例

    這篇文章主要介紹了解讀torch.nn.GRU的輸入及輸出示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • python圖像處理之反色實(shí)現(xiàn)方法

    python圖像處理之反色實(shí)現(xiàn)方法

    這篇文章主要介紹了python圖像處理之反色實(shí)現(xiàn)方法,涉及Python結(jié)合OpenCV與numpy操作圖片的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 自己用python做的一款超炫酷音樂(lè)播放器

    自己用python做的一款超炫酷音樂(lè)播放器

    這篇文章主要介紹了自己用python做的一款超炫酷音樂(lè)播放器,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • python PyTorch預(yù)訓(xùn)練示例

    python PyTorch預(yù)訓(xùn)練示例

    這篇文章主要介紹了python PyTorch預(yù)訓(xùn)練示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Python 下載及安裝詳細(xì)步驟

    Python 下載及安裝詳細(xì)步驟

    這篇文章主要介紹了載及安裝Python詳細(xì)步驟,安裝python分三個(gè)步驟,具體安裝方法本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2019-11-11

最新評(píng)論

循化| 鄂伦春自治旗| 泽普县| 青州市| 新安县| 屯门区| 哈密市| 华阴市| 濮阳县| 黄平县| 合作市| 高邮市| 南溪县| 井陉县| 松阳县| 儋州市| 惠来县| 嘉黎县| 乌审旗| 英超| 鲜城| 永清县| 孟连| 泽普县| 叙永县| 宝鸡市| 河间市| 长武县| 内江市| 台江县| 繁昌县| 沙河市| 玉林市| 汝南县| 怀仁县| 凤山县| 安图县| 万州区| 丰顺县| 安新县| 宁津县|