计数排序之python 实现源码】的更多相关文章

old = [2, 5, 3, 0, 2, 3, 0, 3] new = [0, 0, 0, 0, 0, 0] for i in range(len(old)): new[old[i]] = new[old[i]] + 1 for i in range(len(new)): for j in range(new[i]): print i 计数排序假设被排序的内容是整数,并且在一个比较小的范围内. 计数排序的时间复杂度 O(N).…
tmp = [] def bucket_sort(old): for i in range(len(old)): tmp.append([]) for i in old: tmp[int( i * len(old) )].append(i) for i in range(len(old)): #tmp[i].sort() insert_sort(tmp[i]) for i in range(len(old)): if(len(tmp[i]) > 0): print tmp[i] #test ca…
python:让源码更安全之将py编译成so 应用场景 Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,使用其开发产品快速高效. python的解释特性是将py编译为独有的二进制编码pyc文件,然后对pyc中的指令进行解释执行,但是pyc的反编译却非常简单,可直接反编译为源码,当需要将产品发布到外部环境的时候,源码的保护尤为重要. 准备工作 环境是可为linux/centos,我Windows10本地是Bash on Ubuntu on Windows,用起来很方便,命…
本系列是以陈儒先生的<python源码剖析>为学习素材,所记录的学习内容.不同的是陈儒先生的<python源码剖析>所剖析的是python2.5,本系列对应的是python3.7,所以某些地方会和原著有出入,另外我在介绍的过程中会穿插大量的python代码,不仅仅是介绍如何实现的,还会使用python实际地对我们的结论进行演示.下面就开始吧.不过在开始分析python的实现之前,我们有很多的准备工作要做.比如,首先应该了解一下python的整体架构,来对python的实现有一个宏观…
13.0 序 这一章我们就来看看python中类是怎么实现的,我们知道C不是一个面向对象语言,而python却是一个面向对象的语言,那么在python的底层,是如何使用C来支持python实现面向对象的功能呢?带着这些疑问,我们下面开始剖析python中类的实现机制.另外,在python2中存在着经典类(classic class)和新式类(new style class),但是到Python3中,经典类已经消失了.并且python2官网都快不维护了,因此我们这一章只会介绍新式类. 13.1 p…
1.对象的引用计数 从c代码分析可知,python所有对象的内存有着同样的起始结构:引用计数+类型信息,实际上这些信息在python本体重也是可以透过包来一窥一二的, from ctypes import * class PyObject(Structure): _fields_ = [("refcnt", c_size_t), ("typeid", c_void_p)] a = "this is a string" # 通过id(a)可以获得对…
7.0 序 集合和字典一样,都是性能非常高效的数据结构,性能高效的原因就在于底层使用了哈希表.因此集合和字典的原理本质上是一样的,都是把值映射成索引,通过索引去查找. 7.1 PySetObject 哈希表我们在字典那一章已经介绍过了,因此直接看set在cpython中的实现. //python中的集合的每一个元素,是通过setentry这个结构体来存储的 typedef struct { PyObject *key; // 元素的指针 Py_hash_t hash; // 元素的哈希值 } s…
6.0 序 元素和元素之间可能存在着某种关系,比如学生姓名和成绩.我希望能够通过学生的姓名找到这个学生的成绩,那么只需要将两者关联起来即可.字典正是这么做的,字典中的每个元素就是一个key:value键值对,通过指定的key可以找到value.首先我们在前面的章节中说过,字典这种数据结构,python底层也在大量的使用,比如每一个类都有自己的属性字典,这就意味着python对字典这种数据结构的性能要求是极其苛刻的.所以在python底层,对字典这种数据结构进行了高度的优化.理论上,字典查找元素的…
5.0 序 我们知道对于tuple,就相当于不支持元素添加.修改.删除等操作的list 5.1 PyTupleObject对象 tuple的实现机制非常简单,可以看做是在list的基础上删除了增删改等操作.既然如此,那要元组有什么用呢?毕竟元组的功能只是list的子集.元组存在的最大一个特点就是,它可以作为字典的key.以及可以作为集合的元素.因为字典和集合存储数据的原理是哈希表,字典和集合我们后续章节会说.对于list这样的可变对象来说是可以动态改变的,而哈希值是一开始就计算好的,显然如果支持…
4.0 序 python中的list对象,底层对应的则是PyListObject.如果你熟悉C++,那么会很容易和C++中的list联系起来.但实际上,这个C++中的list大相径庭,反而和STL中的vector比较类似 4.1 PyListObject对象 我们知道python里面的list对象是支持对元素进行增删改查等操作的,list对象里面存储的,底层无一例外都是PyObject * 指针.所以实际上我们可以这样看待python底层的PyListObject:vector<PyObject…