python的記憶體管理
1、==與is
- is比較的是兩個物件的id值是否相等,也就是比較倆物件是否為同一個例項物件,是否指向同一個記憶體地址。
- ==比較的是兩個物件的內容是否相等,預設會呼叫物件的_eq_()方法。
片段一:
>>> a = 256
>>> b = 256
>>> a is b
True
>>>
片段二:
>>> a = 257
>>> b = 257
>>> a is b
False
>>>
處於效能的考慮,python內部做了很多的優化工作,對於整數物件,Python把一些頻繁使用的整數物件快取起來,儲存到一個叫small_ints的連結串列中,在Python的整個生命週期內,任何需要引用這些整數物件的地方,都不再重新建立新的物件,而是直接引用快取中的物件。Python把這些可能頻繁使用的整數物件規定在範圍[-5, 256]之間的小物件放在small_ints中,但凡是需要用些小整數時,就從這裡面取,不再去臨時建立新的物件。因為257不再小整數範圍內,因此儘管a和b的值是一樣,但是他們在Python內部卻是以兩個獨立的物件存在的,各自為政,互不干涉。
>>> c = 257
>>> def foo():
... a = 257
... b = 257
... print a is b
... print a is c
...
>>> foo()
True
False
python程式有程式碼塊構成,程式碼塊是程式的最小基本單位,一個模組檔案、一個函式體、一個類、互動式命令中的單行程式碼都稱為一個程式碼塊。c = 257為一個程式碼塊,函式foo為另一塊程式碼塊,python每部為了將效能進一步的提高,凡是一個程式碼塊建立的證照物件,如果存在一個值與其相同的物件於該程式碼塊中,直接引用,否則建立一個新的物件。Python出於對效能的考慮,但凡是不可變物件,在同一個程式碼塊中的物件,只有是值相同的物件,就不會重複建立,而是直接引用已經存在的物件。 整數和字串物件遵守以上原則。
2、總結
- 小整數物件[-5,256]是全域性直譯器範圍內被重複使用,永遠不會被GC回收。
- 同一個程式碼塊中的不可變物件,只要值是相等的就不會重複建立新的物件。
相關文章
- Python深入 Python的記憶體管理Python記憶體
- Python分享之Python的記憶體管理Python記憶體
- Python深入06 Python的記憶體管理Python記憶體
- 記憶體管理篇——實體記憶體的管理記憶體
- 記憶體管理 記憶體管理概述記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- python如何進行記憶體管理Python記憶體
- Python如何進行記憶體管理?Python記憶體
- Python如何管理記憶體?記憶體分配機制是什麼?Python記憶體
- 【記憶體管理】記憶體佈局記憶體
- CF的記憶體管理。記憶體
- JavaScript的記憶體管理JavaScript記憶體
- 記憶體管理兩部曲之實體記憶體管理記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- Go:記憶體管理與記憶體清理Go記憶體
- Python記憶體管理:基本概念與技巧Python記憶體
- Python記憶體管理機制-《原始碼解析》Python記憶體原始碼
- 【記憶體管理】Oracle AMM自動記憶體管理詳解記憶體Oracle
- 記憶體管理兩部曲之虛擬記憶體管理記憶體
- Linux共享記憶體的管理Linux記憶體
- javascript中的記憶體管理JavaScript記憶體
- JavaScript 記憶體管理JavaScript記憶體
- iOS 記憶體管理iOS記憶體
- Android記憶體管理Android記憶體
- OC記憶體管理記憶體
- 記憶體管理-swMemoryGlobal記憶體
- Flink記憶體管理記憶體
- MySQL記憶體管理MySql記憶體
- 【記憶體管理】Oracle如何使用ASMM自動共享記憶體管理記憶體OracleASM
- 技術分享:Python如何進行記憶體管理?Python記憶體
- C++記憶體管理:簡易記憶體池的實現C++記憶體
- Linux實體記憶體管理Linux記憶體
- 高階記憶體管理程式設計指南-實用的記憶管理記憶體程式設計
- 記憶體管理篇——線性地址的管理記憶體
- Linux 的記憶體分頁管理Linux記憶體
- Linux的記憶體分頁管理Linux記憶體
- MRC 時代的記憶體管理記憶體
- MYSQL的記憶體管理方法MySql記憶體