输入输出
buffer.read() 字节流读入
1 | data = sys.stdin.buffer.read().split() |
- Python 原生
input()/sys.stdin.readline()逐行读入的问题, 面对题目m≤1e6行数据读入,会触发1e6 + 次 IO 系统调用,而 Python 作为解释型语言,对「频繁系统调用」极度敏感; - 普通
sys.stdin.read()是字符流读取,buffer.read()是字节流读取,跳过字符编码转换,速度更快。 sys.stdin.buffer.read().split()会把字节流按空白分割成字符串元素列表,ptr是遍历这个列表的元素索引。
sys.stdout.write() 代替 print()
1 | sys.stdout.write("-1\n") |
Python 原生print()函数并非底层输出,包含大量冗余操作:
- 自动添加换行符、格式化校验;
- 内置输出缓冲机制,会额外占用内存并增加处理耗时。
BFS 相关
时间戳法复用vis访问数组
1 | vis = [0] * (n + 1) # 仅创建1次整数型数组,而非多次创建布尔数组 |
- 只创建一个,节省内存
- 只创建一次,节省时间
- 在 Python 中,
int在赋值、比较的时候比bool快
复用队列
1 | q = deque() # 仅创建1次队列实例 |
变量
局部变量比全局变量快
1 | def main(): |
索引与解包
下面两种方式
1 | # 解包 |
AI 们说索引更快,但也和版本有关。
不过我测试了之后发现,
- 两种方法,3.14 都比 3.6 慢得多;
- 两种版本,索引都比解包慢得多。
其他
1
这样写
1 | for i in range(n): |
要比
1 | for i in range(n): |
以及把 g[i][k] 等赋给变量等要快。
原因:g[i][j] 在最内层循环中只读取了一次。