python 模块&内置函数
import sys
import sys
sys.setrecursionlimit(100000)
为什么要设置递归
如果一个函数直接或通过它调用的其他函数调用自身,那么它是递归的。
虽然递归是构建算法的一种有用的方法,但它可能会占用大量的资源。每次调用函数时,他就会创建一些局部状态(局部变量),内存空间将一直使用,直到函数最终会返回。如果你的递归调用深度达到一百万,那就是内存中的一百万个局部帧。
风险在于递归会炸毁堆栈框架或进程内存,从而导致代码出现硬故障。这是一个非常糟糕的错误,因为整个程序退出时没有清理的能力。即使程序没有崩溃,他会占用大量内存,影响系统的其他部分。可能会有更多的交换和更糟糕的情况,linuxoom杀手可以随机地杀死进程,试图为内核获取资源。
为减少意外递归或错误算法本身不能正确地限制风险,python对递归进行了限制。但是开发人员可以通过
sys.setrecursionlimit(some_huge_number)
来覆盖这个限制,在这种情况下,任何不好的东西都会出现在他们头上
from collections import defaultdict
collections 模块常用类型
- 默认字典 (defaultdict)
dict 的子类,可以调用提供默认值的函数 - 双向队列(deque)
- 计数器(Counter)
- 有序字典(OrderdDict)
- 可命名元组(namedtuple)
import 和 from import的区别
import XX
导入模块对于模块中的函数,每次调用需要“模块.函数”来用。
from XX import fun
直接导入模块中某函数,直接用fun()就可以用。
import os
python中的heapq模块
python 的 heapq 模块提供了对(最小)堆的建立和使用
堆
堆实际就是一个是数组,在物理结构(内存)上是连续存储的,逻辑上数据与数据之间的关系是二叉树
heapq 堆数据结构最重要的特征是 heapq[0]永远是最小的元素
heapq模块
heapq.heappushpop(heap,item)
将item添加到堆中,并从和heap中删除最小项。
内置函数
enumerate()
将一个可遍历的数据对象(e.g. 列表、元组、字符串)组合为一个索引序列,同时列出数据和数据下标。一般用在for 循环中。
enumerate(sequence, [start=0])