官术网_书友最值得收藏!

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。

主站蜘蛛池模板: 霍邱县| 余庆县| 桑植县| 株洲县| 尼玛县| 怀仁县| 临漳县| 铁力市| 巧家县| 类乌齐县| 杭州市| 平舆县| 嵩明县| 英吉沙县| 江口县| 翼城县| 梅州市| 阳信县| 南雄市| 大英县| 马鞍山市| 新晃| 温州市| 武穴市| 泰来县| 岫岩| 姜堰市| 密山市| 广河县| 河西区| 满洲里市| 凭祥市| 青田县| 信宜市| 浏阳市| 都昌县| 新巴尔虎右旗| 监利县| 鹤庆县| 兴义市| 德安县|