- Python進階編程:編寫更高效、優(yōu)雅的Python代碼
- 劉宇宙 謝東 劉艷
- 786字
- 2021-04-30 12:39:33
1.1.1 PyLongObject對象
Python中對整數(shù)這個概念的實現(xiàn)是通過PyLongObject對象來完成的。
第0章講解了定長對象和變長對象的區(qū)別,這是一種關(guān)于對象的二分法。實際上還存在另一種關(guān)于對象的二分法,即根據(jù)對象維護數(shù)據(jù)時的可變性將對象分為可變對象(Mutable)和不可變對象(Immutable)。
這里將要剖析的PyLongObject對象是一個不可變對象,這種不變性是針對PyLong-Object對象中所維護的真實的整數(shù)值而言的。也就是說,在創(chuàng)建了PyLongObject對象之后,就再也不能改變該對象的值了。在Python中,除PyLongObject之外,還有很多對象是不可變對象,比如字符串對象等。
在Python的應(yīng)用程序中,整數(shù)的使用非常廣泛,創(chuàng)建和刪除操作非常頻繁,并且結(jié)合了引用計數(shù)機制,這意味著系統(tǒng)堆將面臨著整數(shù)對象大量的訪問,這樣的執(zhí)行效率可以接受嗎?因此設(shè)計一個高效的運行時機制,使得整數(shù)對象的使用不會成為Python的瓶頸,就成了一個至關(guān)重要的設(shè)計決策。
整數(shù)對象池是解決這個問題的一個非常好的辦法。面向特定對象的緩沖池機制是Python語言實現(xiàn)時的核心設(shè)計策略之一。在Python中,幾乎所有的內(nèi)置對象都會有自己所特有的對象緩沖池機制。
PyLongObject對象的源碼位置為Include/longobject.h及Include/longintrepr.h。
實際上,Python中的整數(shù)對象PyLongObject是對C中原生類型long的簡單包裝。Python中的對象與對象相關(guān)的元信息都保存在與對象對應(yīng)的類型對象中。PyLongObject的類型對象是PyLong_Type。
PyLong_Type的源碼位置為Objects/longobject.c,源碼如下:
PyTypeObject PyLong_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "int", /* tp_name */ offsetof(PyLongObject, ob_digit), /* tp_basicsize */ sizeof(digit), /* tp_itemsize */ 0, /* tp_dealloc */ 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ long_to_decimal_string, /* tp_repr */ &long_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)long_hash, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */ long_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ long_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ long_methods, /* tp_methods */ 0, /* tp_members */ long_getset, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ long_new, /* tp_new */ PyObject_Del, /* tp_free */ };
PyLong_Type中保存了關(guān)于PyLongObject對象的豐富元信息,包括PyLongObject對象應(yīng)該占用的內(nèi)存大小,PyLongObject對象的文檔信息,PyLongObject對象所支持的操作。
從PyLong_Type的源碼中可以看到,創(chuàng)建整數(shù)對象的入口函數(shù)為long_new。該入口函數(shù)的源碼位置為Objects/clinic/longobject.c.h。具體實現(xiàn)函數(shù)為long_new_impl,源碼位置為Objects/longobject.c。
- The Supervised Learning Workshop
- Mastering AWS Lambda
- Learning Bayesian Models with R
- Mastering Unity Shaders and Effects
- WebRTC技術(shù)詳解:從0到1構(gòu)建多人視頻會議系統(tǒng)
- Visual FoxPro程序設(shè)計
- 自然語言處理Python進階
- Instant Nancy Web Development
- Learning Apache Cassandra
- 零基礎(chǔ)學(xué)C語言第2版
- 深入實踐Kotlin元編程
- JQuery風(fēng)暴:完美用戶體驗
- Application Development with Parse using iOS SDK
- Learning Alfresco Web Scripts
- Learning jqPlot