Python虚拟机中字节的实现原理是什么


这篇文章主要介绍“Python虚拟机中字节的实现原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python虚拟机中字节的实现原理是什么”文章能帮助大家解决问题。上面的数据结构用图示如下所示:现在我们来解释一下上面的数据结构各个字段的含义:ob_refcnt,这个还是对象的引用计数的个数,主要是在垃圾回收的时候有用。ob_type,这个是对象的数据类型。ob_size,表示这个对象当中字节的个数。ob_shash,对象的哈希值,如果还没有计算,哈希值为 -1 。ob_sval,一个数据存储一个字节的数据,需要注意的是 ob_sval[size] 一定等于 ‘’ ,表示字符串的结尾。可能你会有疑问上面的结构体当中并没有后面的那么多字节啊,数组只有一个字节的数据啊,这是因为在 cpython 的实现当中除了申请 PyBytesObject 大的小内存空间之外,还会在这个基础之上申请连续的额外的内存空间用于保存数据,在后续的源码分析当中可以看到这一点。下面我们举几个例子来说明一下上面的布局:上面是空和字符串 abc 的字节表示。下面是在 cpython 当中通过字节数创建 PyBytesObject 对象的函数。下面的函数的主要功能是创建一个能够存储 size 个字节大小的数据的 PyBytesObject免费云主机域名 对象,下面的函数最重要的一个步骤就是申请内存空间。我们可以使用一个写例子来看一下实际的 PyBytesObject 内存空间的大小。上面的 44 = 32 + 11 + 1 。其中 32 是 PyBytesObject 4 个字段所占用的内存空间,ob_refcnt、ob_type、ob_size和 ob_shash 各占 8 个字节。11 是表示字符串 “hello world” 占用 11 个字节,最后一个字节是 ‘’ 。这个函数主要是返回 PyBytesObject 对象的字节长度,也就是直接返回 ob_size 的值。在 python 当中执行下面的代码就会执行字节拼接函数:下方就是具体的执行字节拼接的函数:我们修改一个这个函数,在其中加入一条打印语句,然后重新编译 python 执行结果如下所示:在上面的拼接函数当中会拷贝原来的两个字节对象,因此需要谨慎使用,一旦发生非常多的拷贝的话是非常耗费内存的。因此需要警惕使用循环内的内存拼接。比如对于 [b”a”, b”b”, b”c”] 来说,如果使用循环拼接的话,那么会将 b”a” 拷贝两次。因为 b”a”, b”b” 在拼接的时候会将他们分别拷贝一次,在进行 b”ab”,b”c” 拼接的时候又会将 ab 和 c 拷贝一次,那么具体的拷贝情况如下所示:”a” 拷贝了一次。”b” 拷贝了一次。”ab” 拷贝了一次。”c” 拷贝了一次。但是实际上我们的需求是只需要对 [b”a”, b”b”, b”c”] 当中的数据各拷贝一次,如果我们要实现这一点可以使用 b””.join([b”a”, b”b”, b”c”]),直接将 [b”a”, b”b”, b”c”] 作为参数传递,然后各自只拷贝一次,具体的实现代码如下所示,在这个例子当中 sep 就是空串 b””,iterable 就是 [b”a”, b”b”, b”c”] 。在 cpython 的内部实现当中给单字节的字符做了一个小的缓冲池:当创建的 bytes 只有一个字符的时候就可以检查是否 characters 当中已经存在了,如果存在就直接返回这个已经创建好的 PyBytesObject 对象,否则再进行创建。新创建的 PyBytesObject 对象如果长度等于 1 的话也会被加入到这个数组当中。下面是 PyBytesObject 的另外一个创建函数:我们可以使用下面的代码进行验证:从上面的代码可以知道,确实当我们创建的 bytes 的长度等于 1 的时候对象确实是同一个对象。关于“Python虚拟机中字节的实现原理是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。

相关推荐: go语言如何逐个取出字符串

本文小编为大家详细介绍“go语言如何逐个取出字符串”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言如何逐个取出字符串”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Go语言遍历字符串——获取每一个字符串元素遍历每一个ASCII…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/03 10:26
下一篇 06/03 10:29

相关推荐