一、namedtuple:用于构建只有少数属性但无方法的对象
>>> from collections import namedtuple
>>> Card = namedtuple('Card', ['rank', 'suit'])
>>> card = Card(5, 'hearts')
>>> card
Card(rank=5, suit='hearts')
二、bisect:可迭代对象中的插入与查找
import bisect
>>> li
[26, 27, 40, 50, 53, 59, 70, 80, 87, 97]
>>> bisect.insort(li, 30)
>>> li
[26, 27, 30, 40, 50, 53, 59, 70, 80, 87, 97]
>>> bisect.bisect(li, 35)
3
>>> bisect.bisect_left(li, 30)
2
>>> bisect.bisect_right(li, 30)
3
>>> bisect.bisect(li, 30)
3
三、内容视图
>>> numbers = array('h', [-2, -1, 0, 1, 2])
>>> numbers
array('h', [-2, -1, 0, 1, 2])
>>> memv = memoryview(numbers)
>>> len(memv)
5
>>> memv[0]
-2
>>> memv_oct = memv.cast('B')
>>> memv_oct
0x0000000002EB7DC8>
>>> memv_oct.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
>>> memv_oct[5] = 4
>>> numbers
array('h', [-2, -1, 1024, 1, 2])
三、部分情况下列表的替代
- 若仅处理数字,数组更为合适。数组支持可变对象的 pop、insert、extend 等方法,同时还提供文件读取更快的方法,如 frombytes、tofile
- 内容视图:不复制内容,在数据结构之间共享内存
- 若为首尾插入操作较多,可考虑使用双向队列(collections.deque)
- 双向队列对两边操作会更快,但对中间元素操作会更慢
- append 和 popleft 均为原子操作,在多线程中也可安全操作,无需担心资源锁的问题
>>> from collections import deque
>>> dq = deque(range(10), maxlen=10)
>>> dq
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
>>> dq.rotate(3)
>>> dq
deque([7, 8, 9, 0, 1, 2, 3, 4, 5, 6], maxlen=10)
>>> dq.rotate(-3)
>>> dq
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
>>> dq.appendleft(-1)
>>> dq
deque([-1, 0, 1, 2, 3, 4, 5, 6, 7, 8], maxlen=10)
>>> dq.extend([11,22,33])
>>> dq
deque([2, 3, 4, 5, 6, 7, 8, 11, 22, 33], maxlen=10)