dict

Redis 2.8.9源码

旧巷老猫 提交于 2020-12-06 18:25:24
Redis使用字典的方式实现了数据库键空间,今天就记录一下字典的实现方式。 Redis 对字典的描述和实现源码在 src/dict.h src/dict.c,关于学习Redis字典如何进行测试或debug,请参考另外一篇文章: Redis 2.8.9源码 - 字典哈希表操作函数头整理,并注释作用和参数说明(附测试方法和代码以及使用方法) 字典结构: typedef struct dict { dictType *type; //根据存储内容的不同,自定义一组回调函数来控制比较申请内存释放空间等操作 void *privdata; //用于回调函数使用 dictht ht[2]; //存放hash表的结构 0 默认使用0,rehash的时候使用1 int rehashidx; //默认为-1,rehash开始的时候该变量设置为0,完成后重新设置为-1 int iterators; //正在进行的安全迭代的数量,释放安全迭代后会减1 } dict; typedef struct dictType { unsigned int (*hashFunction)(const void *key); //针对不同类型进行hash计算的函数,返回hash值 void *(*keyDup)(void *privdata, const void *key); //复制key void *(

摘抄 python dict() 比 {} 慢6倍左右

你说的曾经没有我的故事 提交于 2019-12-12 22:16:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 看了一个叫 doug hellmann 的哥们儿写的博文 在python2.7中 dict() 函数方式生成字典比直接{}要慢6倍。 实验代码 $ python2.7 -m timeit -n 1000000 -r 5 -v 'dict()' raw times: 0.24 0.24 0.24 0.239 0.24 1000000 loops, best of 5: 0.239 usec per loop $ python2.7 -m timeit -n 1000000 -r 5 -v '{}' raw times: 0.0417 0.0413 0.0407 0.0411 0.042 1000000 loops, best of 5: 0.0407 usec per loop 我在自己机器上试了下,由于是windows 要把单引号换成双引号 ,结果一样。 C:\Users\xxxx>python -m timeit -n 1000000 -r 5 -v "dict()" raw times: 0.195 0.194 0.193 0.191 0.191 1000000 loops, best of 5: 0.191 usec per loop C:\Users\xxxx>python -m timeit -n

zg手册 之 python2.7.7源码分析(3)-- list 对象和 dict 对象

被刻印的时光 ゝ 提交于 2019-11-30 05:24:39
list 对象 list 对象的定义 list对象内部是使用数组实现,在数组中存储的是指针,指向要保存的对象。 allocated是list中数组的大小,ob_size是当前已经使用的数组大小。 typedef struct { // 可变长对象中有 ob_size,保存当前已经使用的数组大小 PyObject_VAR_HEAD PyObject **ob_item; // 数组的指针 Py_ssize_t allocated; // 分配的数组长度 } PyListObject; list 对象的缓存 list对象有缓存机制,对象在释放时会保存到空闲缓存池,待下一次申请的时候使用。 缓存池可以缓存80个list对象,缓存池满的时候list对象直接释放。 从list对象的创建和销毁过程了解它的缓存机制(为了关注重点,代码被简化过)。 // 缓存池的大小定义 #define PyList_MAXFREELIST 80 // 创建新的list对象 PyObject* PyList_New(Py_ssize_t size) { PyListObject *op; size_t nbytes = size * sizeof(PyObject *); // 如果缓存有空闲,直接从缓存中分配list对象的内存 if (numfree) { numfree--; op = free_list