以下例子中, area 計算過程中有臨時物件建立嗎?為什麼?
>>
> pi =
3.14
>>
> r =
2>>
> area = pi * r **
2
python 如何優化臨時物件建立效率?
解答:(看過上面一節講的內容。其實這個問題的答案就已經了然於心了)
(第一問)會有臨時物件建立。 這個語句首先計算半徑 r 的平方,中間結果由乙個臨時物件來儲存,假設是 t ; 然後計算圓周率 pi 與 t 的乘積,得到最終結果並賦值給變數 area ; 最後,銷毀臨時物件 t 。
(第二問)為了提高浮點物件建立效率, python 引入了空閒物件快取池,浮點物件銷毀後, python 並不急於**記憶體,而是將物件放入乙個 空閒鍊錶 。 後續需要建立浮點物件時,先到空閒鍊錶中取,省去分配記憶體的開銷。
解析:答案其實已經說得很清晰了,但是並沒有提到c語言實現的細節。 在c語言底層實現,空閒物件快取池 是乙個 空閒鍊錶,(1)free_list 變數,指向空閒鍊錶 頭節點 的指標;(2)numfree 變數,維護空閒鍊錶 當前長度 ;(3)pyfloat_maxfreelist 巨集,限制空閒鍊錶的 最大長度 ,避免占用過多記憶體(最大長度原始碼裡是 100),(4)ob_type欄位 作為 next指標用
建立物件(兩種方式)最終呼叫的都是
(1)pyfloat_fromdouble 函式通過浮點值建立浮點物件;(2)pyfloat_fromstring 函式通過字串物件建立浮點物件;
而銷毀物件,實際上是呼叫 _py_dealloc 巨集呼叫型別物件 pyfloat_type 中的 tp_dealloc 函式指標: 實現將 物件放入 快取池中。
另外關於空閒物件快取池的細節,就自行參看上節。
以下例子中,變數 e 的 id 值為何與已銷毀的變數 pi 相同?
>>
> pi =
3.14
>>
>
id(pi)
4565221808
>>
>
del pi
>>
> e =
2.71
>>
>
id(e)
4565221808
答案:
python 為了優化浮點物件記憶體分配效率,引入了空閒物件快取池。 浮點物件銷毀後, python 並不急於**物件記憶體,而是將物件快取在空閒鍊錶中,以備後用。
例子中, pi 物件銷毀後, python 先不**物件記憶體,而是將其插空閒物件鍊錶頭部。 當建立浮點物件 e 時, python 從煉表頭取出空閒物件來用,省去了申請記憶體的開銷。 換句話講,pi 物件銷毀後被 e 重新利用了,因此 id 值相同也就不奇怪了。
注釋:這一題就是快取池的原理了,再講下:
if
(numfree >= pyfloat_maxfreelist)
numfree++;
py_type(op)
=(struct _typeobject *
)free_list;
free_list = op;
第三章 JSP內建物件
1 request物件代表了客戶端的請求資訊,主要用於接收通過http協議傳送到伺服器段的資料,包括頭資訊 系統資訊 請求方式 請求引數等。2 獲取請求引數,解決中文亂碼 index.jsp 獲取請求引數的值 show.jsp id引數值為 request.getparameter id 姓名引數值...
第三章 核心物件
一 核心物件 1 每個核心物件都是一片兒記憶體 資料結構 由系統核心分配與訪問。2 令牌物件,事件物件,程序物件,訊號量物件,執行緒物件等都是核心物件。3 核心物件有安全限制,在建立之初就需要傳入乙個結構security attributes的安全描述符 4 類似的還有使用者物件和gdi物件等等,它...
物件導向第三章 多型
多型 多型 是具有表現多種形態的能力的特徵。實現多型的三個必備條件 1.繼承 2.要有重寫 3.父類引用指向子類物件 實現多型的兩種方式 1.使用父類作為方法形參實現多型 2.使用父類作為方法返回值實現多型 多型的好處 通過多型可以減少類中的 量,可以提高 的可擴充套件性和可維護性。繼承是多型的基礎...