python高階之記憶體模型

2022-01-12 16:28:08 字數 1602 閱讀 3243

每乙個程式語言的背後都有自己獨特的記憶體模型支援,比如最經典的c語言,乙個int型別佔8位元組。那麼在python中不區分資料型別,定義乙個變數其在內存在占用多少位元組呢?python中資料的運算其記憶體是如何變化的呢?

python一切資料皆為物件,python中的物件分成兩類:可變物件和不可變物件。所謂可變物件是指,物件的內容可變,而不可變物件是指物件內容不可變。

不可變(immutable):數值(int、float)、字串(string)、元組(tuple)

根據物件的分類,可以將資料型別也做乙個分類,

當對可變和不可變物件運算時會記憶體中會發生什麼事情呢?對比來看

不可變資料型別:

python對於資料的特殊處理

小整數

python為了優化速度,避免為整數頻繁申請和銷毀記憶體空間,使用了小整數物件池。

對小整數的定義是 [-5, 256] 這些整數物件是提前建立好的,不會被垃圾**。

a = 100

b = 100

print(id(a))

print(id(b))

-------------------------

94125443429088

94125443429088

a = 200

b = 200

print a

isb

-----------------true

a = 300

b = 300

print a isb

-----------------false

大整數大整數池: 只儲存包含標準字元(數字、字母、下劃線)的字串,不包含特殊字元的字串 。

python為了避免建立大整數浪費的記憶體空間和時間,將建立過的大整數加入大整數池。

python中大整數池,

預設大整數池裡面為空,每乙個py程式都有乙個大整數池。使用大整數時如果大整數池裡不存在該整數的話,會新建乙個大整數物件。下次使用大整數時直接使用大整數池裡的物件,而不是建立新的物件

a = '

12345

'b = '

12345

'print id(a)

print id(b)

-----------------------------

140139908067808

140139908067808

print a isb

-----------------------------true

其他資料型別

c 之記憶體模型

c 程式在執行時,將記憶體大方向劃分為4個區域 區 存放函式體的二進位制 由作業系統進行管理 你寫的 都轉化成二進位制 全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配和釋放,存放函式的引數值,區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統 記...

面試之記憶體模型

2.記憶體模型中的可見性,原則性,有序性 原子性 多執行緒情況下 原子性是指乙個操作是不可中斷的。即使是在多個執行緒一起執行的時候,乙個操作一旦開始,就不會被其他執行緒干擾。用i 來做為舉例,需要read,load,use,等等的操作,單個操作是原子性的,但是對應整個操作i 來說是不能保證原子性的,...

C 之記憶體模型 記憶體區域

2.malloc calloc realloc底層實現原理 2.2 calloc底層實現原理 2.3 realloc底層實現原理 2.4 分配虛擬記憶體的細節 2.5 free函式實現原理 3.new delete底層實現 4.相關面試題 3.應用 1 棧上的分配極為簡單,移動一下棧指標而已。2 棧...