1.python中list底层怎么实现的
先看下面的程序
>>> L.append(1)
>>> L.append(2)
>>> L.append(3)
>>> L
[1, 2, 3]
>>> for e in L:
... print e
...
1
2
3
cpython中,list对象的结构是:
typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item; #用来保存元素的指针数组
Py_ssize_t allocated; #是ob_item预先分配的内存总容量
} PyListObject;
List initialization初始化:返回l = []
ob_size的大小和len(L)是一样的,而allocated的大小是在内存中已经申请空间大小。通常你会看到allocated的值要比ob_size的值要大。这是为了避免每次有新元素加入list时都要调用realloc进行内存分配。
在list中追加一个整数:L.append(1)。发生了什么?调用了内部的C函数app1()
当你弹出list的最后一个元素:L.pop()。调用listpop(),list_resize在函数listpop()内部被调用,如果这时ob_size(弹出元素后)小于allocated(已经申请的内存空间)的一半。这时申请的内存空间将会缩小。
- list 和dict有什么区别
- list是有序的,dict是无序的
- list通过索引访问,dict使用key访问
- list随着数量的正常增长要想查找元素的时间复杂度为O(n), dict不随数量而增长而变化,时间复杂度都为O(1)
- dict的占用内存稍比list大,会在1.5倍左右
list一般可作为队列、堆栈使用,而dict一般作为聚合统计或者快速使用特征访问等
Tuple可以看做是一种“不变”的List,访问也是通过下标,用小括号()表示
3.手写对dict排序
4.python中key-value数据结构()
python中dict结构,pandas中有Series和dateFrame。
5.dict底层如何实现的
采用的是哈希表实现的。能在o(1)的时间内完成搜索。处理冲突的时候使用的是开放地址法。
PyDictObject对象就是dict的内部实现。字典中的一个key-value键值对元素称为entry(也叫做slots),对应到Python内部是PyDictEntry,PyDictObject就是PyDictEntry的集合。