Python快速读取输入方法咨询(USACO竞赛场景)
更高效的Python竞赛输入读取方法
你的原代码不仅效率偏低,还存在潜在bug——比如如果第一行的n是两位数(比如10 3),用list(input())拆分字符的方式会把n错读成第一位数字。针对竞赛场景的大数据输入,推荐用以下几种更快速且健壮的方法:
方法一:一次性读取所有输入(最推荐)
直接用sys.stdin.read()把所有输入内容一次性读入,再分割成整数列表,这种方式能最大程度减少IO开销,是竞赛中处理大量输入的最优解:
import sys # 读取所有输入并转换为整数列表 all_data = list(map(int, sys.stdin.read().split())) n = all_data[0] k = all_data[1] # 从第2个元素开始取n个数字作为diamonds diamonds = all_data[2:2+n]
方法二:按行批量读取
如果不想一次性读取全部内容,也可以先把所有行读入内存再处理,比循环调用input()效率高:
import sys # 读取所有非空行 lines = [line.strip() for line in sys.stdin if line.strip()] # 处理第一行 n, k = map(int, lines[0].split()) # 处理后续n行 diamonds = list(map(int, lines[1:n+1]))
为什么这些方法更快?
原代码循环调用input()时,每次都会触发一次IO操作,当输入数据量很大(比如上万条数据)时,频繁的IO会导致程序运行变慢。而一次性读取所有内容或批量读取行,能把IO操作的次数降到最低,大幅提升输入处理速度。
另外,这些方法也解决了原代码的健壮性问题,不管n和k是几位数,都能正确读取。
内容的提问来源于stack exchange,提问作者Darren Pan
相关产品推荐
相关产品推荐

