搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
知新_RL
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
【全网最强文档智能】大模型 + RAG + PDF问答,居然比 PyPDF + langchain 还好用!_rag对于论文pdf的处理
2
C# sqlite for wp7
3
如何记住linux的命令,自己总结LINUX命令及记忆
4
9大最佳知识库软件/文档管理工具_好用的个人离线知识库软件
5
docker 使用运行指令讲解
6
redis登录测试hydra以及python脚本方式_hydra redis
7
今年大火的元宇宙,到底是什么?_bh黑洞元宇宙
8
gm怎么刷东西 rust_只使用 rust,可以写一个 flutter 吗?
9
07 Windows 7 AI工具-爬虫环境配置【看这一篇就够了!】(包含适用于Windows7的Anaconda、python、pycharm下载链接/报错解决方法)_python anaconda windows 7
10
vue打包后页面为空白或者路由跳转404解决_vue打包后路由失效
当前位置:
article
> 正文
Python源码剖析----深度探索动态语言核心技术读书笔记
作者:知新_RL | 2024-03-06 13:53:18
赞
踩
Python源码剖析----深度探索动态语言核心技术读书笔记
python类型对象
python中对象通用的部分有共同的定义
但是还要知道在内存中分配的空间,存储这数据的信息在哪呢?
在pyobject中没有这样的信息,其实这种说法是不对的,这个信息虽然不显见与pyobject中,但是隐身于pyobject中,占用内存空间的大小是对象的元信息,这种元信息与对象所属的类型密切相关
在typeobject的定义中包含了许多的信息,主要分为4类
类型名:tp_name
创建对象时分配内存空间的大小信息:tp_basicsize和tp_itemsize
与该对象相关联的操作信息
pytypeobject
对象就是python中对面向对象理论中类的概念
基于pytypeobject的python对象体系后面会深度分析
对象的创建:我们命令python创建一个整数对象,python内部究竟如何从无到有创建出一个整数对象呢?
一般来说有两种方法:python C api 和pyint_type
python的C API分为两类:一类称为范型的API,或者称为AOL
另一类是与类型相关的API或者称为COL。这类API通常只作用在某一种类型的对象上。
类型的类型,其实python中类型也是一种对象类型的类型是type类型
python的多态特性,python在内部各个函数之间传递都是一种范性指针------pyobject*
python中的引用计数:在现代开发的编程语言中一般选择了由语言本身来维护和管理,即采用了垃圾收集机制,ob_refcnt变量决定这对象的创建和消亡
如果熟悉设计模式中的观察者模式,就可以隐约看到其中的影子,让ob_refcnt减为0时就会触发对象销毁事件
各个对象提供了不同的事件处理函数,而事件的注册动作正是在各个对象对应了类型对象中静态完成的
ob_refcnt是一个32位整形变量,说明一个对象的引用不会超过一个整形变量的最大值。
每一个对象指向类型对象的指针不能视为对类型对象的引用
当引用为0时并不意味这就要free内存,因为这样太消耗资源,python中会引入内存对象池的概念,避免了频繁申请和释放内存空间,通常是将空间归还到内存池中
python中的对象大致分为5类(不一定准确)
类型对象、数值对象、容纳其他对象的序列集合对象、map关联对象、python虚拟机在运行时内部使用的对象
python中的整数对象int就是对c中原生类型long的简单的包装
python中的整数对象池,几乎所有的內建对象都会有自己的对象池机制
两个int类型对象的比较实际上是long值的比较
以整数对象为例pynumbermethods中定义了一个对象作为数值对象时的所有可选的操作信息。
一共有39个函数指针,包括加减法等
python的所有的数据都躺在内存堆中
python支持调整小整数池的边界大小,但是需要自己改源码再重新编译
在intobject.c蕴含着小整数对象池的所有代码,不过1000行,small_ints就是
在python2.5后默认就是[-5,257),不过可以修改NSMALLPOINTS和NSMALLNEGINTS重新编译Python可以延伸小整数对象池
就是一次性都放入内存,而不用每次都申请释放资源
时间换空间思想
如果小整数池机制被激活尝试用小整数对象池,如果不能使用小整数对象池则使用通用的整数对象池
python中的字符串对象,对于变长的对象在对象创建时是不知道的
int类型对象在对象在对象创建时长度就已经确定了
在定义时不知道,在创建时知道
string和tuple是不可变对象
string是变长对象对象中的不可变对象
string类型变长很好理解,但是不可变对象???
不可变对象使得string类型可以作为dict的键值,也使得字符串的操作效率大大降低
ob_shash是用来缓存对象的hash值,默认的初始值为-1,在dict中这个hash发挥了很大的作用
字符串的hash值和python的intern机制使得python虚拟机运行的效率提高了20%
tp_itemsize指明了变长对象保存长度(一个对象在内存中的长度)
和ob_size共同决定了应该额外申请的内存的大小
字符串长度有限制,与所属的平台有关
还需要判断字符串的长度是否为空,如果不是空字符串才创建申请内存
字符串的最后为\0为了便于判断终止条件
字符串对象的intern机制,当字符组长度为0时触发intern机制
类似于享元模式,共享短小的字符串,下次不用再次申请
这个机制即节省了空间又简化了对象之间的比较
在python中因为一切都是对象,所以所有的=都是引用
当a和b创建的字符串相同时,b申请空间会直接返回a的引用,而不是重新再次申请内存空间
intern机制只有字符串中有,基于字符串派生出来的数据结构都没有intern的机制
intern机制的核心在于interned,在stringobject.c中被定义为static project *interned
内部就是一个map字典,用来处理是否被intern机制处理过
pytho对于字符串对象也创建了对象池,字符串缓冲池
小整数缓冲池是python初始化时创建的,字符串缓冲池是以静态变量形式存在的
python初始化之后所有的stringobj指针都为空
创建字符串对象先进行intern操作,将结果放入缓冲池,下次再次创建,先检查是否是字符串对象,如果检查是否在缓冲池中,如果有直接返回
string的效率问题,因为python的string为不可变对象,当字符串相加时就会再次申请内存空间,所以在数据量大的时候用join操作,一次性申请内存
python的list和c++的vector非常相似
list存放的都是pyobject的指针
list是变长的,和string不同的是其支持删除、插入等操作,可以在运行时动态的维护内存和元素,所以是可变对象
list中allocated和ob_size都与对象的内存管理有关
和cpp的vector的管理方式是一样的,并不是存多少东西就申请多大的内存,这样的管理
第五章 dict
一种关联式容器,关联式容器会极大的关注键的搜索效率,在cpp中的map会用设计良好的数据结构:RB-tree(红黑树)搜索的时间复杂度为O(log2N)
Python中也提供关联式的容器dict,没有利用红黑树用的散列表,在最优的情况下可以提供O(1)的搜索效率
散列表的思想是通过一定的函数将需要搜索的键值映射为整数,然后访问连续内存的第n个位置就可以拿到,核心是将key映射成整数,再通过这个整数访问内存中的区域里的值,对于映射函数称为散列函数,映射后的值为散列值
选择散列函数的优劣直接决定了散列表的搜索效率
不同的对象经过散列函数的运算可能被映射为相同的散列值,随着存储的增加散列冲突会发生的越来越频繁
当装载率大于2/3时散列冲突发生的概率就会大大增加
解决散列冲突可以使用二次探测函数,Python中为开放地址法
hashtable中采用的是开链法
Python中删除对象时是伪删除,后面会重点讨论
dict是一大堆的entry集合
第六章
Python
虚拟机
Python的虚拟机不像c#和Java,而是一种更高级的虚拟机
通过dll文件编译成PyCodeObject字节码最后在变成机器码
pyc文件只是对外的一种表现形式,并不是真正的字节码
python虚拟机有很大部分时间浪费在确定一个符号的对象是什么
py文件经过Python编译器编译后共得到3个PyCodeObject对象
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/知新_RL/article/detail/199256
推荐阅读
article
Python -
Permission
Error: [Errno 13]
Permission
de...
报错信息
Permission
Error: [Errno 13]
Permission
deni
ed: "..."即 权限...
赞
踩
article
python
-用
pyinstaller
以及用
pipenv
安装虚拟环境时,都遇到
Permission
...
先上
解决办法
:
解决办法
很简单,也很气人,就是关闭360安全卫士就OK了,害得我搞了快一天,啊啊啊,生气呀!问题描述:把....
赞
踩
article
Python
迭代
器...
一、
迭代
器
迭代
是访问集合元素的一种方式。
迭代
器是一个可以记住遍历的位置的对象。
迭代
器对象从集合的第一个元素开始访问,直到...
赞
踩
article
Python
:
迭代
器
的
简单理解...
一、什么是
迭代
器
迭代
,顾名思义就是重复做一些事很多次(就现在循环中做
的
那样)。
迭代
器
是实现了__next__()方法
的
对...
赞
踩
article
Python
深
拷贝
和浅
拷贝
深
析...
1.可变对象与不可变对象创建变量:python创建一个变量,可以看作先创建了对象,然后在该对象上贴了一个变量名标签,也可...
赞
踩
article
python
-520表白
代码
,
我看谁说程序员不懂
浪漫
,
送你几套表白
代码
,
一步到位
_给
女朋友
的
代码
...
520到了
,
还被
女朋友
问送什么礼物吗?鲜花?口红?看电影?很俗
的
好不好
,
给你
女朋友
一个程序员
的
Surprise吧
,
来来来...
赞
踩
article
【
python
】代码
实现
计算天数
倒
计时
_
python
倒
数日
...
python
实现
计算考研
倒
计时
_
python
倒
数日
python
倒
数日
import dateti...
赞
踩
article
Python
第8章
课后练习
2 以
原点
为
中心
,绘
http
制
5
个
同心圆
,半径分别为20,40,60,8...
Python
课后练习
_
python
,
以
原点
位
中心
,
绘制
5
个
同心圆
python
,
以
原点
位
中心
,
绘制
5
个
同心圆
...
赞
踩
article
Python
· 助力冬奥:
turtle
绘制
奥运五环
_
turtle
海龟
aoyunwuhuanhuit...
hello,大家好,我是wangzirui32,今天我们来学习如何使用
turtle
绘制
奥运五环,开始学习吧!1. 代码1...
赞
踩
article
【
Python
】
python
乌龟
画图——利用
python
乌龟
绘画奥运五环_
turtle
画
运动会
海报...
使用
turtle
乌龟
绘制奥运五环。_
turtle
画
运动会
海报
turtle
画
运动会
海报 要求: 使...
赞
踩
article
python
——奥运五环绘制_
import
turtle
#导入库
coordinate
_x = [...
#奥运五环
import
turtle
coordA=[-11
0
,
0
,
11
0
,
-55
,
55]coordB=[-25
,
-25
,
...
赞
踩
article
Python
Turtle
绘图[难度2星]:奥运
五环
(用最简单
的
方法
实现
五环
套接
)_
turtle
画
五...
绘制
五环
的
代码网上很多,但是大部分代码没能
实现
五环
套接
;少数
实现
了
的
,代码也较难。本文用最简单
的
方法
实现
了
五环
套接
。_t...
赞
踩
article
python
广义
似然比
_
回归
五式第三式:定序
回归
——
手机
功能
对
消费者
偏好
的
影响
分析
(内含
报告
和Py...
0 目录1.简单
分析
报告
2.具体操作(1)数据读取和处理(2)描述性
分析
(3)假设检验与参数估计(4)模型选择(5)预测...
赞
踩
article
python
logistic
多标签,
python
中多类
logistic
回归
的
特征选择
...
当然,有几种方法可以选择您
的
特性。但有时下一个简单
的
方法可以帮助你。你可以在线性模型
的
帮助下评估你
的
特征
的
贡献(通过对结...
赞
踩
article
Python
基于BP
神经网络
实现多特征多
分类
_
python
基于给定
数据
集
,
采用三层bp
神经网络
方法...
本文介绍了利用BP
神经网络
实现对不同半径的圆进行多
分类
(3
分类
),特征即为圆的半径。输入层12节点,一个6节点的隐藏层,...
赞
踩
article
【运筹优化】带
时间
窗
约束
的
车辆
路径
规划
问题(
VRPTW
)详解 +
Python
调用
Gurobi
...
车辆
路径
规划
问题(Vehicle Routing Problem,VRP)一般指的是:对一系列发货点和收货点,组织调用一...
赞
踩
article
Python
:
离线
部署
python
环境,并
安装
第三方
包_
python
paho
离线
安装
...
离线
部署
python
环境,并
安装
第三方
包工作中,服务器一般是不会开放连接外网的,那么我们在
安装
一些软件和环境的时候,就会...
赞
踩
article
开发知识点-
Python
-
conda
...
使用
conda
来创建和管理不同的
Python
环境,并在这些环境中安装不同版本的
Python
。
conda
是一个...
赞
踩
article
python
虚拟环境
迁移
_
python
虚拟环境
能否移植到其他
服务器
吗...
python
运维
迁移
_
python
虚拟环境
能否移植到其他
服务器
吗
python
虚拟环境
能否移植到其他
服务器
吗 ...
赞
踩
article
【
疑难杂症
】
conda
虚拟环境
里使用
which
python
与
虚拟环境
名称对应不上的问题...
把.bashrc里的这行删除,重新指定export PATH="/home/xxx/ana
conda
3/bin:$PAT...
赞
踩
相关标签
PermissionError
Python - PermissionError
Permission denied
python
开发语言
经验分享
几何学
pycharm
ide
网络
python 广义似然比
python logistic 多标签
算法
人工智能
VRPTW
车辆路径规划
Python