日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python3怎么定义long_python3 整数类型PyLongObject 和PyObject源码分析

發布時間:2024/9/27 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3怎么定义long_python3 整数类型PyLongObject 和PyObject源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python3 整數類型PyLongObject 和PyObject源碼分析

一 測試環境介紹和準備

測試環境:

操作系統:windows10

Python版本:3.7.0 下載地址

VS版本:vs2015社區版(免費) 下載地址

win10SDK(安裝vs2015是可以選擇,如果沒有安裝則需要獨立安裝)

http://ffmpeg.club/python

二 如何查看源碼

1 下載python源碼

https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz

http://www.ffmpeg.club/python

下載后解壓縮

使用vs2015或者vs2017打開

Python-3.7.0\PCbuild\pcbuild.sln 解決方案文件

打開pythoncore項目可以找到\include\object.h文件

三 源碼分析

python源碼版本 python3.7.0

在python中所有的類型都可以轉為PyObject類型,單python用的是c語言,并沒有繼承機制,我們可以通過源碼看它試如何實現的,我們先看PyObject源碼

1 PyObject 源碼

typedef struct _object {

_PyObject_HEAD_EXTRA

Py_ssize_t ob_refcnt;

struct _typeobject *ob_type;

} PyObject;

1-1 _PyObject_HEAD_EXTRA 源碼

我們先看第一個成員是一個宏 _PyObject_HEAD_EXTRA,這個宏是如下定義

#ifdef Py_TRACE_REFS

/Define pointers to support a doubly-linked list of all live heap objects./

#define _PyObject_HEAD_EXTRA \

struct _object _ob_next; \

struct _object_ob_prev;

#define _PyObject_EXTRA_INIT 0, 0,

#else

#define _PyObject_HEAD_EXTRA

#define _PyObject_EXTRA_INIT

#endif

通過代碼我們可以看出,它根據環境給_PyObject_HEAD_EXTRA設置的值有可能是空的,或者是一個雙向鏈表。通過編譯代碼我們知道,他在debug版本的python中是用的雙向鏈表,而在release版本中是空。

1-2 Py_ssize_t ob_refcnt 引用計數

Py_ssize_t 類型在32位程序中就是int,在64位win程序中是__int64

引用計數的策略后面我們專門寫文章分析

1-3 struct _typeobject ob_type;

源碼比較長,就不全部列出來,這個結構體中包含了一個PyObject對象的所有相關操作函數和屬性,比如對象創建和銷毀函數,print對象的序列化函數等,存儲方式都是通過函數指針。所以每種python類型都會對各類操作函數指針做賦值設定。

其中的PyObject_VAR_HEAD宏內容如下

typedef struct {

PyObject ob_base;

Py_ssize_t ob_size; / Number of items in variable part */

} PyVarObject;

2 PyLongObject 整數對象

digit

struct _longobject {

PyObject_VAR_HEAD

digit ob_digit[1];

};

2-1 小數預處理

對于比較小的數(-5到257 )直接返回初始化好的值,所以說大量的小整數時,不會新增額外的空間

do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \

return get_small_int((sdigit)ival); \

} while(0)

2-2 按照數字的發小分配空間,以unsigned short為單位

數字少于16位也就是2個字節的,用一個digit (unsigned short) 存放

數字少于32位也就是4個字節的,用兩個個digit (unsigned short) 存放

2-3 大數處理

如果是超大數,就用多個字節存放,由于變量就是一個 unsigned long,先看一下源碼:

對于不同的系統,大數能表示的范圍不一致,因為數字采用的是unsigned long存放,在不同的系統大小不一致,可以見如下表

其中 windows 64位使用的是 LLP64所以 在window中python數字的最大值也就是4個字節,如果用它來存放64位指針的地址,就會丟失數據。

在linux(ubuntu16.04 64)使用的是LP64,,所以數字最大值就是8個字節。

相關視頻可以觀看

http://edu.51cto.com/course/15278.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的python3怎么定义long_python3 整数类型PyLongObject 和PyObject源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费的黄色av | 蜜臀久久99精品久久久久久 | 黄色视屏免费 | 欧美精品综合 | 伊人精品视频在线观看 | 黄色网页入口 | 中文字幕在线免费观看视频 | 久久a久久| 男男巨肉啪啪动漫3d | 国产不卡在线播放 | 男女免费看 | 伊人免费视频二 | 抱着老师的嫩臀猛然挺进视频 | 中国人妖和人妖做爰 | 裸体毛片 | 男女视频在线免费观看 | 国产天堂资源 | 欧美日韩综合一区二区 | 久久免费手机视频 | 日本不卡网站 | 久久亚洲精 | 舒淇裸体午夜理伦 | 欧美少妇xx | 日本成人福利视频 | 黄色喷水视频 | 国产男男一区二区三区 | 污网在线看 | www.国产在线视频 | 噜噜av| 蜜臀网在线| 啪啪网视频 | 亚洲欧美不卡 | 青青草在线免费视频 | 青春草视频在线免费观看 | 欧美日韩亚洲国产一区 | 麻豆精品| 99热一区二区三区 | 男人天堂1024| 亚洲免费av电影 | 色在线综合 | 少女与动物高清版在线观看 | 伊人网狼人 | 久久艹av | 激情文学亚洲色图 | 精国产人伦一区二区三区 | 邵氏电影《金莲外传2》免费观看 | 无遮挡边吃摸边吃奶边做 | 免费的黄色小视频 | 琪琪色在线视频 | 人人干网站 | 色眯眯av | 蜜桃成人在线观看 | 精品欧美一区二区精品少妇 | 一区二区三区四区视频在线观看 | 91视频综合网 | 熟妇人妻中文字幕无码老熟妇 | 奇米影视777在线观看 | 少妇精品亚洲一区二区成人 | 国产成人免费视频网站 | av字幕网| 日韩激情毛片 | 久久久九九 | 男男车车的车车网站w98免费 | 在线国产一区二区三区 | 色婷婷激情五月 | 亚洲精品国产精品乱码视色 | 国产欧美一区二区三区在线老狼 | 欧美激情69| 五月激情丁香婷婷 | 日韩视频二区 | 亚洲精品粉嫩小泬20p | 精品视频一区二区 | 一区二区三区www | 亚洲激情欧美色图 | 久久香蕉精品视频 | 少妇av片 | 60分钟 | 黄色香蕉网站 | 黄色av一级片 | 污视频免费看 | www精品| 国精品人妻无码一区二区三区喝尿 | 免费无遮挡网站 | 一区二区三区免费观看视频 | 在线看免费av | 人妻视频一区二区三区 | 国产成人精品综合久久久久99 | 熟妇人妻一区二区三区四区 | 丰满熟妇肥白一区二区在线 | аⅴ资源天堂资源库在线 | 国产成人a v | 国产夜夜操 | 69xxxx日本 | 欧美一区二区在线视频观看 | 亚洲一卡二卡在线 | 偷偷色噜狠狠狠狠的777米奇 | 欧美综合视频在线观看 | 国产尤物在线视频 | 日本不卡视频一区二区三区 |