python数据类型原理实现
元组和列表
1,元组与列表的性能分析
可以通过计算创建元组的时间与创建列表的时间相对比。
在此可以使用python的第三方库,ipython,timeit.timeit。
终端输入ipython即可进入交互式编程。通过timeit方法,执行命令并返回执行时间,从而得到python在初始化元组和列表,在性能上所耗费的时间。
初始化列表时,一开始会定义一个容量,随着数量的增多会再次进行空间分配扩容。
初始化元组时,则是直接将容量定死,有点像java中的数组的感觉,所以元组比列表占用性能更少。
那么什么使用选用元组,什么时候选用了表呢?
假若一个变量集在定义之后会发生扩容,变动,则采用列表。
假若变量集定义之后不发生变动,则使用元组。
2,命名元组
常规元组,在不知道内容数据的情况下想去取值只能通过下表取值会相当的麻烦。
命名元组,可以通过对象属性的形式精准的从元组中取出想要的数据,
涉及到的包为 from collections import namedtuple (命名元组包)
stu_info = namedtuple('类型名字',['name','age','gender'])
参数1,参数2,列表,返回为一个对象
stu_info = namedtuple('类型名字',['name','age','gender']) # param1 类型名字 param2 列表 返回为一个对象 tu = stu_info("adi","18","man") print(tu.name) print(type(tu)) print(type(stu_info))
如此便可以像对象.属性这样去调用元组内部的数据。
3,字典和集合
空字典空集合的定义方式,
set=set(),dict={}
集合最常见用法是用来去重,list-->set-->list,内部数据根据set的特性完成去重
集合
集合添加数据。
set.add() 一次只能添加一个元素,可交集并补集操作,这些常用在科学计算中。
set.update({集合}) 将一个集合更新到另一个集合中,等同与列表中的extend方法
set.copy() 复制方法 用于拷贝一个集合,无返回。
字典和集合的原理以及应用
dict和set实现原理是一样的,都是将实际的值放在list中,唯一不同的点在于hash函数操作的对象
对于set
hash函数操作的dict是key,而set是直接操作它的元素,假设操作内容为x,其作为因变量放入hash函数,然后通过运算后取list的余数,转化为下一个list的下表,此下表位置对于set而言放其本身。
对于dict
而对于dict则是创建了两个list,一个list该下表放key,另一个list放该下表对应的value。
其中吧实现了set的方式叫做hashset,实现dict的方式叫做hash map/table
map值就是通过key来寻找value的过程,dict村的时候,一个列表存key,一个列表存value
数值类型区分
序列 字符串,列表,元组
散列 字典,集合,特征为内部元素是无需的
注意:py37之后,字典变为有序,按照赋值的先后排序
可变和不可变元素,其本质是可hash与不可hash
可变类型数据不可进行hash操作,不可变类型可以进行hash操作
集合有一个特殊的功能,如果有一个元素不知道其是否为可变,丢到集合里面,集合里面只能存放可hash的不可变对象。
性能上的分析
时间上 集合>字典>元组>列表
占用内存上 字典>集合>列表>元组