
Python 小知识:字典、队列与排序
Python 字典
Python 的很多东西其实都是基于 dict(函数的形参在内部就使用了 dict 结构),有人说过 Python 其实就是个包裹在一堆语法糖中的字典,也正因此 Python 对 dict 进行了特殊优化,处理速度非常快。set 也是同理,Python 的 set 比其他语言高级不少,支持了基本数学上所有的集合方法,在检索方面相较于列表也是速度更快的。
Python 队列
列表虽然功能强大,理论上可以作为大部分容器来使用,但实际上在针对很多问题时列表并不是最好的选择。比如针对 FIFO 的问题时,deque(双端队列)是更好的选择,因为它从左边以及右边增删元素都是 O(1),还可以设置 maxlen 可选参数来指定队列长度,队列满时左边新增右边就删,反之同理。deque 还有一些特殊方法如 rotate,可以从某一端取出指定数量的元素加到另一端,也是相当有意思的(注意,deque 从中间取元素的效率并不高)。
当然,queue 模块中的队列在一些情况下也是不错的选择,但需要注意的是,queue.Queue 指定 maxsize 满后并不会删除元素,而是会阻塞等待元素取走再添加。
asyncio 中的队列底层是基于 deque 等数据结构实现的,并非专有的异步队列,而是结合了异步等待机制(我一直以为会有完全专属于异步的队列呢)。
Python 排序算法
还有,Python 的排序算法是 Timsort,是一个非常高效的算法,创始人 Tim 同样也是 Python 的老行家了,Python 之禅就出于他手。
说到排序,就不得不提到 key 关键参数了,这在很多语言中并不常见,它可以通过指定 key 来实现一些特殊的排序,比如可以用 key=int 对一个只包含数字字符串的列表进行数值排序(key 需要是一个函数),它最大的优点是排序过程中每个元素只会被调用一次 key 函数。(值得一提的是,max 和 min 函数也有 key 可选参数)



