python篇---看面经总结(总结中)

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(已经申请的内存空间)的一半。这时申请的内存空间将会缩小。

  • Python中list的实现
  1. list 和dict有什么区别
    1. list是有序的,dict是无序的
    2. list通过索引访问,dict使用key访问
    3. list随着数量的正常增长要想查找元素的时间复杂度为O(n), dict不随数量而增长而变化,时间复杂度都为O(1)
    4. dict的占用内存稍比list大,会在1.5倍左右

list一般可作为队列、堆栈使用,而dict一般作为聚合统计或者快速使用特征访问等
Tuple可以看做是一种“不变”的List,访问也是通过下标,用小括号()表示

  • python中list,dict,tuple的区别

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的集合。

  • python的dict实现
  • 实现原理

你可能感兴趣的:(python篇---看面经总结(总结中))