- 博客(40)
- 收藏
- 关注
原创 Python源码之内存管理机制(一)---内存管理架构
文章目录1、Python内存管理架构2、小块空间的内存池2.1 Block2.2 pool2.3 arena2.4 内存池1、Python内存管理架构 在Python中,内的管理被抽象成一种层次化的结构,在解析Python的内存管理机制前,有必要对Python的内存管理架构模型做一些了解。 在最底层也就是第0层,是操作系统所提供的一些内存管理的接口,例如C中的malloc, realloc,free等。在这一层是由操作系统来实现并管理的,对于Python来说touch不到这一层的行为权限。 再
2020-05-26 10:03:44 478
原创 Python源码之dict字典底层解析
文章目录1、PyDictObject1.2 PyDictKeyEntry1.3PyDictKeysObject1.4 PyDictObject2、探究entry三种状态3、PyDictObject的创建与操作3.1 PyDictObject的创建3.2 谈谈PyDictObject中的hash table3.3 PyDictobject对象的元素搜索3.4 PyDictObject的元素插入 python中的dict可能我们最常用的容器之一了,它是一种用来存储某种关系映射的数据对的集合。在其他语言中例如
2020-05-14 23:53:17 1840
原创 Java集合之List类型--LinkedList底层源码剖析
文章目录1、LinkedList简介2、LinkedList底层实现2.1、LinkedList初始化2.2、 添加元素2.3、查找给定元素3、总结1、LinkedList简介 LikedList是List接口的实现类,与ArrayList不同的是它的底层实现不是数组,而是一个双向链表。由此我们可以知道,LinkedList比起ArrayList更适合做插入删除等操作,因为ArrayList在指定位置插入需要做元素的搬移,但是对于天生就支持插入的链表结构来说,只需要更改指针指向即可。而其对于数据的访问
2021-12-15 14:56:11 986
原创 聊聊TCP恋爱史--三次牵手四次分手
TCP概述 TCP在OSI五层协议中处于运输层,运输层主要为相互通信的应用进程提供逻辑通信,它可以为它上面的应用层提供通行服务,属于面向通信部分的最高层。我们知道在IP协议中能够将源主机发出的分组按照首部中的目的地址通过路由分组发送到目的主机。但是这个分组还停留在主机的网络层,并没有交付到主机的进程中。因此通信的端点并非是主机而是主机中的进程,因此主机的通信实际上是主机中进程的通信。 根据应用程序的不同的需求,运输层主要有两种不同的协议,一种是无连接的UDP协议;另一种就是面向连接的TCP协..
2020-06-21 14:24:07 569
原创 堆的原理实现详解以及堆的应用
文章目录堆是什么堆的存储方式插入结点删除结点堆排序代码实现堆是什么 堆(heap)本质上就是一棵完全二叉树,只不过这棵完全二叉树有点特别,能够被称为堆的二叉树,除了它必须要是一棵完全二叉树外,它的每一个结点都必须大于或者小于其子节点。 解释一下就是对于树中的所有的结点都至少有一棵子树,对于这个结点的子树上所有的结点都必须要大于或者小于其父节点。因此,堆也是个递归的定义,通常,我们将结点都大于或者等于子树所有结点的堆称为最大堆 ;将结点都小于或者等于子树所有结点的堆称为最小堆 。如下图所示:
2020-06-15 18:41:46 1265
原创 MySQL索引实现原理剖析及使用策略优化
索引是什么 有些人对索引的解释说索引就像是书的目录,用来提高查询的效率,我觉得是废话,说了和没说一样。不如直接看看MySQL官方给出的解释:“With the exception of spatial indexes, InnoDB indexes are B-tree data structures. ”。因此,从这段描述中,可以知道,索引就是一种数据结构,通过这种特定的数据结构以及查找算法来实现对数据库中数据记录查找的快速性。 现在来想一想假如没有索引在数据库中查询一条记录会是怎么样的流..
2020-06-14 18:36:35 174
原创 图及其遍历方式--广度优先&深度优先
图的定义及其分类 图和之前说的二叉树一样也是一种非线性数据结构,图由两部分组成:其一是顶点;其二是顶点之间连接的边。顶点就是图中的元素结点,而边就是用来表示顶点之间的关系,如下图:每个顶点的边的条数就是顶点的度, 例如社交产品中,我们每一个人就是图中的顶点,而我们的好友就是该通过边直接连接的顶点,我们好友的个数就是顶点的度。 上图所示的是一种图,它并没有方向的概念,我们知道有些关系之间是有方向的概念的,例如,微博中的关注关系,你关注了某个人但是这个人不一定关注了你。因此,这种图称为有向图..
2020-06-12 13:54:23 879
原创 字符串匹配算法之BF算法 & RK算法 & BM算法原理及实现
BF算法 BF算法实际上就是暴力破解算法,它的优点就是简单但性能差。它的基本思想就是将模式串与主串中的子串依次比较。 假如我们需要在字符串A中匹配是否存在字符串B,这时我们就把A串叫做主串,把B串叫做模式串。而A串中字符数量等于B串字符数量的串称为子串。我们记A串的长度为n,B串的长度为m。 在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的。我通过一个图来说明我们可以看到在第一次匹配时,从主串的第一个字符为0处开始匹配,每..
2020-06-11 11:00:53 877
原创 二叉树查找树与平衡二叉树原理剖析与实现
文章目录1、什么是二叉树(Binary Tree)2、二叉树的存储方式3、二叉树的遍历4、二叉查找树(Binary Search Tree)4.1 查找操作4.2 插入操作4.3 删除操作5、平衡二叉树(AVL Tree)1、什么是二叉树(Binary Tree) 二叉树是一种特殊的树,之前我们所讲的数据结构都是线性结构,今天说的二叉树就是一种非线性结构的数据结构。它是具有如下特点的树:其一,每个结点最多只有两棵子树(也就是二叉树中不存在结点的度大于2的结点);其二,二叉树的子树具有左右之分,而且顺序
2020-06-09 15:38:00 579
原创 scrapy之Spider组件以及Item对象源码分析
1、Spider组件 Spider类定义了抓取一个或者多个网页的动作,以及如何提取结构化的数据。对Spider来说整个流程如同下面的循环:(1)从第一个URL中生成第一个初始化的Request,并设置回调函数,当这些Requst下载生成response后,这些回调函数将被调用。(2)在回调函数内解析返回的response并生返回Item对象或者Request对象,或者是一个包含二者的可迭代对象。返回的Request会通过scrapy处理,并交由Downloader下载,并调用设置的回调函数(3)在
2020-06-08 12:14:36 457
原创 如何设计高度可用的Hash Table之深度剖析哈希表原理
文章目录1、为什么要说哈希表2、什么是哈希表3、哈希函数的构造4、哈希冲突的处理4.1 开放定址法4.2 链地址法5、如何设计一个健壮的哈希表5.1 Hash Table的扩容5.2 如何选择扩容的策略5.3 开放定址法 VS 链地址法6、如何让哈希表中的数据有序? 看这篇博客的时候,我认为你可以结合我的另一篇博客一起阅读,关于Python中的Dict对象的底层实现(如果你有C语言的基础的话),这篇博客中我深入剖析了Python3.6的版本中Dict对象的底层源码,但是我还是建议你先看这篇博客,然后再对
2020-06-07 18:38:50 344
原创 scrapy之架构简介及数据流
文章目录1、scrapy简介2、scrapy架构概览3、组件(components)4、数据流(Data Flow)5、白话文1、scrapy简介 scrapy是一个基于Twisted异步框架的一个高效爬取框架,它是一个纯Python编写的框架,它提供了几个重要的组件,你只需要简单地步骤就可以实现一个网站的爬取。除此之外scrapy还是一个扩展性非常强的框架,你可以基于这些组件取定制适合你业务的功能。2、scrapy架构概览 我们来看看官方文档上给出的架构,先上图,再解释3、组件(compo
2020-06-06 22:53:29 767
原创 Redis对事务处理详解
文章目录Redis事务的概念multiexecdiscardwatch & unwatch乐观锁和悲观锁Redis事务的概念 关于事务的概念不用多说了,大家都懂,关于DBMS中的事务可以参考一下我的这篇博客:https://blog.csdn.net/Leccen/article/details/106583721 我们知道redis的理念是追求简单和高效,因此它的事务并没有像关系数据库那样复杂。redis的事务是一组命令的集合,一个事务中所有命令都会序列化,其他客户端提交的命令请
2020-06-06 18:40:20 344
原创 数据库的事务与并发控制
文章目录1、事务简介2、并发控制2.1 并发执行2.2 可串行化调度(Serializable)3、锁协议3.1 封锁3.2 封锁协议3.2.1 一级封锁协议3.2.2 二级封锁协议3.2.3 三级封锁协议4、活锁和死锁4.1 活锁4.2 死锁4.2.1 死锁的预防4.2.2 死锁的诊断和解除5、锁的粒度1、事务简介 事务(Transaction)是指用户定义的一个数据库操作序列,这些操作要门全做,要么全都不做,是一个不可分割的整体。 我想,99%的在阐述事务的概念时都会用银行转账的例子,那么我也用这
2020-06-06 16:42:59 1653
原创 高效的查找结构之跳跃表(Skip List)
什么是跳跃表 说实话跳跃表是我非常喜欢的数据结构,虽然很多数据结构和算法的书中并没有讲它,为什么喜欢呢?因为我觉得它最好玩,为什么好玩呢?我也不知道,就是觉得好玩。好了,说了几句废话,现在言归正传。我们之前说过单链表的结构,对于单链表而言,它对于某个元素的查找的时间复杂度是O(n),无论单链表中的数据是有序还是无序都必须要遍历链表上的结点。OK,那我们知道折半查找的性能是非常高的(它实际上也是分而治之的算法思想,由于折半查找比较简单,生活中也随处可见它的案例,所以我没讲这部份内容,不知道的可以去..
2020-06-05 21:59:58 1353
原创 redis持久化--RDB和AOF机制深入解析
文章目录1、什么是持久化(persistence)2、RDB机制2.1 RDB机制的流程2.2 触发方式2.3 RDB机制主要配置信息3、AOF机制3.1 AOF执行流程3.2 同步的策略3.3 重写机制3.4 AOF主要配置信息4、RDB VS AOFRDB优点RDB缺点AOF优点AOF缺点1、什么是持久化(persistence) 我们知道redis是基于内存的数据结构服务器,基于内存就意味着它的读写性能特别高,但是你在享受它的优点时就必须接受它的缺点,由于基于内存。而内存的特点是数据易失,一旦发
2020-06-05 13:44:13 208
原创 进程的概念与进程的管理详解
文章目录1、进程的概念2、进程的状态和组成2.1 进程的基本状态2.2 进程的实体2.3 进程间的组织方式3、进程的管理3.1 进程的创建3.2 进程的终止3.3 进程的阻塞3.4 进程的唤醒4、线程1、进程的概念 进程(process)一直一来都没有一个较为严格的定义,大多是从其功能的角度解释它。那么进程和程序之间是怎样的一个关系呢?我们先来看看程序,程序就是指令的一个集合,是一个静态的概念,而在多道程序设计系统中,CPU在各个程序之间来回切换,这个程序运行一会儿另一个程序运行一会儿,就是说各个程序
2020-06-04 18:38:26 508
原创 操作系统概述及其结构
文章目录1、计算机硬件结构1.1 处理器1.2 存储器1.3 I/O设备1.4 总线2、操作系统的概念3、操作系统特征和结构设计1、计算机硬件结构 计算机硬件是软件建立与活动的基础,而软件是对硬件的扩充。所以不管是硬件还是软件对于整个计算机体系来说是不可分割的,现代计算机体系结构基本仍然采用冯. 诺依曼体系结构。从功能上讲,计算机硬件有五大部分组成:运算器、控制器、存储器和输入/输出设备。1.1 处理器 cpu是计算机的大脑,它从内存中提取指令并执行它们,其工作周期是提取指令,译码分析,
2020-06-04 14:19:15 1541
原创 排序算法之线性排序--桶排序&计数排序&基数排序
之前我们讲了两类排序算法,它们的时间复杂度分别为O(n^2)和O(nlogn)。这两类排序算法都是基于元素之间比较的算法,接下里要说的几种排序算法都是不基于元素之间比较的算法,因此它们的时间复杂度能够做到O(n),所以这几种排序算法被称为线性排序。 那么既然这几种算法性能这么好,那它们有什么缺点吗?有,其一空间复杂度较之前的比较高,其二它们对数据本身要求很苛刻。现在我们就来看看。桶排序(Bucket Sort) 桶大家都不陌生,它用来装一个或者多个东西的,我们将n个待排序的数据分别放入k个
2020-06-03 16:05:16 289
原创 排序算法之归并排序&快速排序
之前我们说了冒泡排序和直接插入排序,这两种排序算法都是O(n^2)的时间复杂度,在数据规模小的时候可以使用这两种,但是对于数据规模比较大的情况复杂度就会比较大了,因此在这一节中我们来看看另外两种排序算法,归并排序和快速排序。归并排序(Merge Sort) 归并排序实际上利用了分而治之的思想,我们先将一个无序的数组分解成两个部分,分别对这两个数组递归进行归并排序,最后将结果合并就能得到一个有序的数组了。也就是说我们是将原本一个大的问题分解成多个小的子问题,这些子问题除了数据规模不一样,求解
2020-06-03 00:04:05 413
原创 HTTP协议原理详解
文章目录1、HTTP协议简介1、URL简介3、HTTP请求过程4、HTTP协议的特点4.1 无状态(stateless)4.2 无连接5、http报文结构5.1 开始行5.1.1 请求行5.1.1.1 方法5.1.1.2 URL5.1.1.3 版本5.1.2 响应行5.2 首部行5.2.1 请求行5.2.1 响应行5.3 实体主体5.3.1 请求体5.3.2 响应体6、cookies & session1、HTTP协议简介 HTTP(HyperText Transfer Protocol)协议
2020-06-02 13:27:06 959
原创 爬虫中的那些反爬虫措施以及解决方法
在爬虫中遇到反爬虫真的是家常便饭了,这篇博客我想结合我自己的经验将遇到过的那些问题给出来,并给出一些解决方案。1、UserAgent UserAgent的设置能使服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本等信息。对于一些网站来说,它会检查我们发送的请求中所携带的UserAgent字段,如果非浏览器,就会被识别为爬虫,一旦被识别出来, 我们的爬虫也就无法正常爬取数据了。解决方法 收集常见的useragent作为配置文件,每次访问的时候取出一个作为头部发送请求,需
2020-06-01 22:55:13 3223 2
原创 排序算法之冒泡排序&插入排序
排序概述 排序在计算机程序收集中是一种非常重要的操作,它的功能是将一个数据元素的任意序列,重新排列成一个按照关键字有序的序列。排序算法有非常多,各种各样的排序,你很难去说哪一个最好哪一个更好,只能说 ”存在即合理“ ,每一种排序算法都有自己的特点和优势之处,因此在什么样的场景下选用什么样的排序算法就显得很重要了,这就需要我们能够较为全面地去分析一个排序算法,那么我们一般可以从这几个方面来分析一个排序算法:1、时间开销: 这个不用多说,是我们必须要关注的一个点,而且我们需要关注最坏情况的时间复杂..
2020-06-01 17:51:49 718
原创 线性表之队列(queue)结构
1、队列的定义 队列和栈一样同样是操作受限的一种数据结构,但是和栈不一样的是,队列是一种先进先出(first in first out FIFO)的线性表,它只允许在表的一端进行插入操作,而在另一端进行删除操作。在队列中,允许插入操作的一端被称之为队尾(rear),允许删除的一端称为队头(front)。 队列在程序设计中是很常见的一种数据结构,例如操作系统中的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业在运行,这些作业被按照队列的方式进行排队。我们给出一个图示方便理解:2、队列的表
2020-05-31 18:07:56 1118
原创 XPath相关用法总结
xpath是什么 xpath是一种xml路径语言,它提供了一种在xml文档中搜索信息的语法和方式,由于它也可以用来对HTML文档进行搜索,因此它在爬虫中用来作为信息抽取是一种不错的选择,而且它的速度还快。如何使用 在Python中,使用XPath可以先安装LXML库。可以使用 pip install lxml 快速安装,安装好就可以使用了。使用方法如下:# 导入etreefrom lxml import etree# 将网页source code转换为被XPath识别和选择的..
2020-05-31 12:38:29 1191
原创 线性表之栈(stack)结构与实现
栈的定义 栈是一种操作受限的数据结构,它只能在表尾进行插入和删除操作,因此对于栈来讲,表尾有特殊的含义,我们称为栈顶(top),表头端称为栈底(bottom), 不含元素的空表称为空栈。栈是一种后进先出(LIFO) 的的线性表。也就是说这种数据结构,对于先进入栈的元素,会比后进入栈的元素更后出来。举个简单的生活中的例子:当有很多人在等电梯的时候,你是第一个进去的,你站到了最里面也就是栈底,但是在如果大家都在同一楼层下的话,你是最后才能出去的。这就是一个典型的栈在生活中的例子。 可能你会问,既然栈是
2020-05-28 12:06:03 486
原创 Python源码之内存管理机制(二)---垃圾回收机制
文章目录1、引用计数1.1 循环引用问题2、三色标记机制3、垃圾收集机制3.1 对象集合--双向链表3.2 分代回收机制3.3 标记-清除机制3.3.1 寻找root object的集合3.3.2 垃圾标记3.3.3 垃圾回收4、垃圾收集机制总结1、引用计数 在之前的文章中我们都有看到各种与引用计数相关的东西,Python和Java,c#一样也在语言层面实现了动态的内存管理机制,这一点我们很清楚,这就意味着我们从繁琐的手动内存管理中解放了,将内存的释放和各种管理交给Python自己完成,我们可以看到在
2020-05-27 11:42:36 487
原创 线性表之链表原理与实现
1、链表的存储结构 之前我们讲过顺序表,顺序表的特点就是数据之间逻辑上的相邻关系在物理位置上也是相邻的,因此它可以通过寻址公式随机存取任意一个元素,但是这种特点也为元素的删除和插入带来了极大的不便。链表的特点就是:元素之间逻辑上的相邻关系在物理位置上并不一定相邻,元素的物理地址可以是任意一个合法的地址,这些元素通过指针联系在一起形成了一条链式结构,这样的结构在插入和删除操作时就不需要挪动元素位置,只是通过简单的修改指针的指向就可以了,因此理论上它的时间复杂度为O(1),同时,由于这种特性,因此每个元素的
2020-05-23 18:23:19 1026
原创 深夜的小短叹
不知不觉又到了深夜凌晨两点过,又发表了一篇长长的blog,不知道为什么每次在写blog的时候总觉得自己将所学所积累的各种知识挖掘出来,当完成一片blog后在点击发表的时候总会激动不已。可能这就是对于一个技术猿的诱惑,当我们面对一堆代码时,一开始一堆乱,但是当静下心来,慢慢理出头绪来就会想继续把它理得更加清楚,当完全理清楚时,就有一种想跳的冲动。 可能这就是编程的魅力,对技术总有一种追求,无止境的追求,当面对一个,想到解决方案后,啪啪啪地敲着代码,再看着它,觉得哪里不够优雅,再尝试优化,当你觉得它足够
2020-05-23 01:06:20 361 1
原创 Python源码之虚拟机
文章目录1、Python虚拟机架构1.1 虚拟机的执行环境1.2 PyFrameObject对象1.3 PyFrameObject对象的创建2、命名空间2.1 Python程序的构成模块2.2 符号赋值2.3 作用域2.3.1 LGB规则2.3.2 global表达式3、virtual machine 运行框架 Python虚拟机是Python的核心部分,它负责很多事情包括运行字节码等等,从前面我们知道,当Python的source code被编译成字节码指令,之后就由Python虚拟机负责根据上下文环
2020-05-23 00:29:57 737
原创 线性表之顺序表原理与操作
1、线性表的定义 所谓线性表就像是一条线一样连在一起的数据结构,它的严格的定义是:在有限非空的集合中,存在唯一的被称为 ”第一个“ 的数据元素;存在唯一的被称为 ”最后一个“ 的数据元素;除了第一个数据元素外,集合中所有元素有且仅有唯一的前驱元素;除了最后一个元素外,集合中有且仅有唯一的后继元素。2、线性表的顺序表示2.1 顺序表的存储结构 线性表的顺序表示我们简称为顺序表,它表示用一组地址连续的的内存单元一次存储元素,从这个定义我们可以知道这种存储方式实际上是用屋里地址上的连续性来表示
2020-05-22 10:36:09 590
原创 Python源码之编译与字节码
文章目录1、Python程序的执行流程2、PyCodeObject对象2.1 pyc文件2.2 PyCodeObject对象2.3 再谈pyc文件3、Pyc文件的生成3.1 Pyc文件的创建3.2 pyc文件的写入1、Python程序的执行流程 我们经常会听到有人说,啊,Python是一种解释性语言,太low啦。其实Python从原理上讲和Java等语言一样都是通过一个解释程序将source code翻译成中间代码也就是字节码,然后由虚拟机来执行。在Python中有个非常核心的东西就是解释器,因此我们
2020-05-21 21:52:13 1107
原创 代码的执行效率与资源消耗
我们知道程序实际上就是解决的数据的存取以及数据计算的,因此怎么样在低的空间消耗下最快的完成计算任务就是衡量我们代码能力的一个重要标准。数据结构和算法就是解决这两个问题的,如果要设计出好的程序就必须知道如何去衡量一段代码的好坏,也就是做复杂度的分析。1、 时间复杂度 先来看看时间复杂度的定义: 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函
2020-05-21 01:33:50 589
原创 Python源码之Set集合对象底层解析
文章目录1、PySetObject对象2、PySetObject对象的创建3、PySetObject对象元素的插入4、PySetObject对象元素的删除5、PySetObject对象的扩容机制1、PySetObject对象 之前我们解析了Python中的dict对象,我们知道在dict的底层实际上是一个hash table,是一种映射关系。同样,集合对象底层也是hash table,因此,对于细节的描述在这一节就不细说了。关于hash table可参照这篇文章。python的dict对象底层实现,话
2020-05-20 19:03:27 1355
原创 Python源码之list列表对象底层解析
在Python中我们使用地最多的容器应该就是list了,list具有非常强大的功能,它不仅拥有像Java等其他语言的数组一样通过下标索引来读取列表中元素的功能,而且又高于数组,因为它可以在容器中存储不同类型的数据。为什么列表会具有这么强大的功能呢?实际上,其底层就是一个数据结构中的线性表的顺序表结构,只不过,它并非简单的一体式存储,而是采用了分离式的顺序表结构,在后面的解析中我们会慢慢一步步揭开它的神秘面纱,那么当我们在利用列表容器来对一系列数据进行操作时,是否能够清楚地了解其底层做了哪些事情吗?接下来
2020-05-12 18:54:21 938
原创 Python中源码之字符串底层解析
Python中的字符串对象概述Python的对象分为 “可变对象” 和 “不可变对象”, 可变对象也还可以分为 “可变” 和 “不可变”,这里所谓的可变就是说对象所维护的数据是可以变化的,举个例子说明,list容器中的元素可以进行添加、删除、修改等操作,也就是说这个容器对象所维护的数据是可以动态变化的;而所谓 “不可变” 就是说,此对象中所维护的数据一旦创建后就不能发生改变,即便对这个对象进行...
2019-12-02 14:29:13 1072
原创 Python源码之整数对象底层解析
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...
2019-11-22 21:08:24 637
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人