什么是python语言的动态类型机制_python的内存管理机制
一、python是一個什么樣類型的語言
1、python是一種動態解釋性強類型定義的高級、通用性編程語言。
解釋型:執行的時候,才一條一條的解釋成機器語言給計算機來執行。如:python、js、ruby、PHP等
編譯型:把源程序的每一條語句都編譯成機器語言,并保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度快。如:C、C++、go等
動態語言:動態類型的語言編程時,永遠也不用給任何變量指定數據類型,該語言會在你第一次賦值給變量時,在內部將數據類型記錄下來
靜態語言:與動態類型語言剛好相反,它的數據類型是在編譯其間檢查的,也就是說在寫程序時要聲明所有變量的數據類型
強類型定義語言:一旦一個變量被指定了某個數據類型,如果不經過強制轉換,那么它就永遠是這個數據類型
弱類型定義語言:數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變量可以賦不同數據類型的值
二、python的內存管理機制
python的內存管理機制:引用計數、垃圾回收、內存池機制
1、變量與對象
1、變量:通過變量指針引用對象
變量指針:指向具體對象的內存空間,取對象的值。
2、對象,類型已知,每個對象都包含一個頭部信息(頭部信息:類型標識符和引用計數器)
注意:變量名沒有類型,類型屬于對象(因為變量引用對象,所以類型隨對象),變量引用什么類型的對象,變量就是什么類型的。
a、容器對象
Python的一個容器對象(比如:表、詞典等),可以包含多個對象。
容器對象:容器對象中包含的并不是元素對象本身,是指向各個元素對象的引用。
1、Python緩存了整數和短字符串,因此每個對象在內存中只存有一份,引用所指對象就是相同的,即使使用賦值語句,也只是創造新的引用,而不是對象本身;
2、Python沒有緩存長字符串、列表及其他對象,可以有多個相同的對象,可以使用賦值語句創建出新的對象。
2、引用計數
a、普通引用
注意:當使用某個引用作為參數,傳遞給getrefcount()時,參數實際上創建了一個臨時的引用。因此,getrefcount()所得到的結果,會比期望的多1。
b、容器對象
c、引用計數增加
1、對象被創建
2、另外的別人被創建
3、作為容器對象的一個元素
d、引用計數減少
1、對象的別名被顯式的銷毀
2、對象的一個別名被賦值給其他對象
3、對象從一個窗口對象中移除,或,窗口對象本身被銷毀
4、一個本地引用離開了它的作用域,比如上面的foo(x)函數結束時,x指向的對象引用減1。
3、垃圾回收
吃太多,總會變胖,Python也是這樣。當Python中的對象越來越多,它們將占據越來越大的內存。不過你
不用太擔心Python的體形,它會乖巧的在適當的時候“減肥”,啟動垃圾回收(garbage collection),將沒用的
對象清除。在許多語言中都有垃圾回收機制,比如Java和Ruby。盡管最終目的都是塑造苗條的提醒,但不同
語言的減肥方案有很大的差異 (這一點可以對比本文和Java內存管理與垃圾回收)。
從基本原理上,當Python的某個對象的引用計數降為0時,說明沒有任何引用指向該對象,該對象就成為要被
回收的垃圾了。比如某個新建對象,它被分配給某個引用,對象的引用計數變為1。如果引用被刪除,對象的引
用計數為0,那么該對象就可以被垃圾回收。比如下面的表:
a =[1,2,3]
dela
del a后,已經沒有任何引用指向之前建立的[1, 2, 3]這個表。用戶不可能通過任何方式接觸或者動用這個對象。
這個對象如果繼續待在內存里,就成了不健康的脂肪。當垃圾回收啟動時,Python掃描到這個引用計數為0的對象,
就將它所占據的內存清空。
然而,減肥是個昂貴而費力的事情。垃圾回收時,Python不能進行其它的任務。頻繁的垃圾回收將大大降低Python的
工作效率。如果內存中的對象不多,就沒有必要總啟動垃圾回收。所以,Python只會在特定條件下,自動啟動垃圾回收。
當Python運行時,會記錄其中分配對象(object allocation)和取消分配對象(object deallocation)的次數。當兩者的差值高于
某個閾值時,垃圾回收才會啟動。
我們可以通過gc模塊的get_threshold()方法,查看該閾值:
importgc
print(gc.get_threshold())
返回(700, 10, 10),后面的兩個10是與分代回收相關的閾值,后面可以看到。700即是垃圾回收啟動的閾值。可以
通過gc中的set_threshold()方法重新設置。
我們也可以手動啟動垃圾回收,即使用gc.collect()。
分代回收
Python同時采用了分代(generation)回收的策略。這一策略的基本假設是,存活時間越久的對象,越不可能在
后面的程序中變成垃圾。我們的程序往往會產生大量的對象,許多對象很快產生和消失,但也有一些對象長期被使用。
出于信任和效率,對于這樣一些“長壽”對象,我們相信它們的用處,所以減少在垃圾回收中掃描它們的頻率。
Python將所有的對象分為0,1,2三代。所有的新建對象都是0代對象。當某一代對象經歷過垃圾回收,依然存活,那么它就
被歸入下一代對象。垃圾回收啟動時,一定會掃描所有的0代對象。如果0代經過一定次數垃圾回收,那么就啟動對0代和1代的
掃描清理。當1代也經歷了一定次數的垃圾回收后,那么會啟動對0,1,2,即對所有對象進行掃描。
這兩個次數即上面get_threshold()返回的(700, 10, 10)返回的兩個10。也就是說,每10次0代垃圾回收,會配合1次1代的垃圾
回收;而每10次1代的垃圾回收,才會有1次的2代垃圾回收。
同樣可以用set_threshold()來調整,比如對2代對象進行更頻繁的掃描。
importgc
gc.set_threshold(700,10,5)
4、內存池機制
Python中有分為大內存和小內存:(256K為界限分大小內存)
1、大內存使用malloc進行分配
2、小內存使用內存池進行分配
3、Python的內存池(金字塔)
第3層:最上層,用戶對Python對象的直接操作
第1層和第2層:內存池,有Python的接口函數PyMem_Malloc實現-----若請求分配的內存在1~256字節之間就
使用內存池管理系統進行分配,調用malloc函數分配內存,但是每次只會分配一塊大小為256K的大塊內存,不會
調用free函數釋放內存,將該內存塊留在內存池中以便下次使用。
第0層:大內存-----若請求分配的內存大于256K,malloc函數分配內存,free函數釋放內存。
第-1,-2層:操作系統進行操作
內容來自:
原文地址:https://www.cnblogs.com/youhongliang/p/12207714.html
總結
以上是生活随笔為你收集整理的什么是python语言的动态类型机制_python的内存管理机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求回答,柏尔定制地板怎么样?
- 下一篇: python 爬虫 scrapy 和 r