cpython源碼
A. 《python源碼剖析深度探索動態語言核心技術》pdf下載在線閱讀,求百度網盤雲資源
《Python源碼剖析》(陳儒)電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:https://pan..com/s/1dtk-nY5HtgXS3CIBVHJCRA
書名:Python源碼剖析
作者:陳儒
豆瓣評分:8.8
出版社:電子工業出版社
出版年份:2008-6
頁數:480
內容簡介:
作為主流的動態語言,Python不僅簡單易學、移植性好,而且擁有強大豐富的庫的支持。此外,Python強大的可擴展性,讓開發人員既可以非常容易地利用C/C++編寫Python的擴展模塊,還能將Python嵌入到C/C++程序中,為自己的系統添加動態擴展和動態編程的能力。.
為了更好地利用Python語言,無論是使用Python語言本身,還是將Python與C/C++交互使用,深刻理解Python的運行原理都是非常重要的。本書以CPython為研究對象,在C代碼一級,深入細致地剖析了Python的實現。書中不僅包括了對大量Python內置對象的剖析,更將大量的篇幅用於對Python虛擬機及Python高級特性的剖析。通過此書,讀者能夠透徹地理解Python中的一般表達式、控制結構、異常機制、類機制、多線程機制、模塊的動態載入機制、內存管理機制等核心技術的運行原理,同時,本書所揭示的動態語言的核心技術對於理解其他動態語言,如 Javascript、Ruby等也有較大的參考價值。..
本書適合於Python程序員、動態語言愛好者、C程序員閱讀
B. python怎麼看package源碼
首先你要找到源碼的位置,你可以使用下面的方法:
如果你可以在命令行運行python,你可以使用下面的命令查看目錄。
>>>importstring
>>>string.__file__
'/usr/lib/python2.7/string.pyc'
>>>
對應目錄下的string.py就是package的源碼,不過有些庫因為是c寫的,會提示錯誤,這樣的庫就需要你下載python源碼,直接看c的源文件了。
如果解決了您的問題請採納!
如果未解決請繼續追問!
C. python官網有幾個下載文件,有什麼區別如下
1.Windows x86 MSI Installer (2.7.8)
- 32位系統安裝的python
2.Windows x86 MSI program database (2.7.8)
- 32位python源碼的符號庫。 如果做純Python開發,為python的C介面開發准備的。
3.Windows X86-64 MSI Installer (2.7.8)
- 64位系統安裝的python
4.Windows X86-64 MSI program database (2.7.8)
- 64位python源碼的符號庫。 如果做純Python開發,為python的C介面開發准備的。
D. 我想知道如何查看python的源代碼
查看腳本的話(python中部分函數是直接用C語言嵌入的,要在官網上搜C源碼),可以使用Pycharm,或者其他IDLE,比如我想查看python中TensorFlow包的Session函數:
任意在pycharm內的一個.py文件中,輸入這個函數
import tensorFlow as tf #載入包並命名為tf
tf.Session()
然後按住Ctrl按鈕,左鍵單擊Session,就自動打開了對應.py文件
另外一種方法是直接在python本地庫中找對應的.py文件,(可以用help函數先搜索)
E. Python對象
眾所周知,Python是一門面向對象的語言,在Python無論是數值、字元串、函數亦或是類型、類,都是對象。
對象是在 堆 上分配的結構,我們定義的所有變數、函數等,都存儲於堆內存,而變數名、函數名則是一個存儲於 棧 中、指向堆中具體結構的引用。
要想深入學習Python,首先需要知道Python對象的定義。
我們通常說的Python都是指CPython,底層由C語言實現,源碼地址: cpython [GitHub]
Python對象的定義位於 Include/object.h ,是一個名為 PyObject 的結構體:
Python中的所有對象都繼承自PyObejct,PyObject包含一個用於垃圾回收的雙向鏈表,一個引用計數變數 ob_refcnt 和 一個類型對象指針 ob_type
從PyObejct的注釋中,我們可以看到這樣一句:每個指向 可變大小Python對象 的指針也可以轉換為 PyVarObject* (可變大小的Python對象會在下文中解釋)。 PyVarObejct 就是在PyObject的基礎上多了一個 ob_size 欄位,用於存儲元素個數:
在PyObject結構中,還有一個類型對象指針 ob_type ,用於表示Python對象是什麼類型,定義Python對象類型的是一個 PyTypeObject 介面體
實際定義是位於 Include/cpython/object.h 的 _typeobject :
在這個類型對象中,不僅包含了對象的類型,還包含了如分配內存大小、對象標准操作等信息,主要分為:
以Python中的 int類型 為例,int類型對象的定義如下:
從PyObject的定義中我們知道,每個對象的 ob_type 都要指向一個具體的類型對象,比如一個數值型對象 100 ,它的ob_type會指向 int類型對象PyLong_Type 。
PyTypeObject結構體第一行是一個PyObject_VAR_HEAD宏,查看宏定義可知PyTypeObject是一個變長對象
也就是說,歸根結底 類型對象也是一個對象 ,也有ob_type屬性,那 PyLong_Type 的 ob_type 是什麼呢?
回到PyLong_Type的定義,第一行 PyVarObject_HEAD_INIT(&PyType_Type, 0) ,查看對應的宏定義
由以上關系可以知道, PyVarObject_HEAD_INIT(&PyType_Type, 0) = { { _PyObject_EXTRA_INIT 1, &PyType_Type } 0} ,將其代入 PyObject_VAR_HEAD ,得到一個變長對象:
這樣看就很明確了,PyLong_Type的類型就是PyType_Typ,同理可知, Python類型對象的類型就是PyType_Type ,而 PyType_Type對象的類型是它本身
從上述內容中,我們知道了對象和對象類型的定義,那麼根據定義,對象可以有以下兩種分類
Python對象定義有 PyObject 和 PyVarObject ,因此,根據對象大小是否可變的區別,Python對象可以劃分為 可變對象(變長對象) 和 不可變對象(定長對象)
原本的對象a大小並沒有改變,只是s引用的對象改變了。這里的對象a、對象b就是定長對象
可以看到,變數l仍然指向對象a,只是對象a的內容發生了改變,數據量變大了。這里的對象a就是變長對象
由於存在以上特性,所以使用這兩種對象還會帶來一種區別:
聲明 s2 = s ,修改s的值: s = 'new string' ,s2的值不會一起改變,因為只是s指向了一個新的對象,s2指向的舊對象的值並沒有發生改變
聲明 l2 = l ,修改l的值: l.append(6) ,此時l2的值會一起改變,因為l和l2指向的是同一個對象,而該對象的內容被l修改了
此外,對於 字元串 對象,Python還有一套內存復用機制,如果兩個字元串變數值相同,那它們將共用同一個對象:
對於 數值型 對象,Python會默認創建0~2 8 以內的整數對象,也就是 0 ~ 256 之間的數值對象是共用的:
按照Python數據類型,對象可分為以下幾類:
Python創建對象有兩種方式,泛型API和和類型相關的API
這類API通常以 PyObject_xxx 的形式命名,可以應用在任意Python對象上,如:
使用 PyObjecg_New 創建一個數值型對象:
這類API通常只能作用於一種類型的對象上,如:
使用 PyLong_FromLong 創建一個數值型對象:
在我們使用Python聲明變數的時候,並不需要為變數指派類型,在給變數賦值的時候,可以賦值任意類型數據,如:
從Python對象的定義我們已經可以知曉造成這個特點的原因了,Python創建對象時,會分配內存進行初始化,然後Python內部通過 PyObject* 變數來維護這個對象,所以在Python內部各函數直接傳遞的都是一種泛型指針 PyObject* ,這個指針所指向的對象類型是不固定的,只能通過所指對象的 ob_type 屬性動態進行判斷,而Python正是通過 ob_type 實現了多態機制
Python在管理維護對象時,通過引用計數來判斷內存中的對象是否需要被銷毀,Python中所有事物都是對象,所有對象都有引用計數 ob_refcnt 。
當一個對象的引用計數減少到0之後,Python將會釋放該對象所佔用的內存和系統資源。
但這並不意味著最終一定會釋放內存空間,因為頻繁申請釋放內存會大大降低Python的執行效率,因此Python中採用了內存對象池的技術,是的對象釋放的空間會還給內存池,而不是直接釋放,後續需要申請空間時,優先從內存對象池中獲取。