Python竞赛编程:现有stdin快速读取代码能否再提速5%?
优化Python竞赛编程中的大输入读取性能
针对你的大输入读取性能瓶颈,这里有几个直接的优化方案,能轻松超过你需要的5%性能提升:
核心优化方案:用C实现的字节串操作替代纯Python循环
你的原代码通过Python循环逐个字节拼接整数,这是性能瓶颈的核心——纯Python循环的执行效率远低于C层面的内置操作。可以利用bytes.split()(默认分割所有空白符,匹配你的输入格式)和int()(直接支持字节串转整数)来重构代码:
import sys def createInputIterator(): # 一次性读取全部二进制输入 data = sys.stdin.buffer.read() # 按空白符分割字节串,逐个转成整数并yield for num_bytes in data.split(): yield int(num_bytes) iterator = createInputIterator() # 使用方式不变 x = next(iterator)
甚至可以简化为更高效的生成器表达式:
import sys iterator = (int(b) for b in sys.stdin.buffer.read().split())
优化细节说明
- 替换手动数值拼接:
int(b'1234')是C层面实现的操作,比Python循环中vs *=10; vs += v-48的速度快一个数量级 - 简化读取逻辑:
sys.stdin.buffer.read()无需提前获取输入大小,自动读取到EOF,避免了fstat的系统调用开销,同时适配管道/非文件类输入场景 - 修复原代码的隐藏bug:原代码在输入末尾无分隔符时,会漏掉最后一个整数;
split()会自动处理所有非空白片段,无论末尾是否有分隔符
额外性能微调
如果还想进一步压榨性能,可以:
- 把
sys.stdin.buffer.read()的结果赋值给局部变量,减少全局属性访问的开销 - 避免函数调用开销,直接使用生成器表达式(如上面的简化版本)
这些优化后,输入读取环节的性能会远超原代码,完全能满足2秒时限的要求。
内容的提问来源于stack exchange,提问作者Murilo Perrone
相关产品推荐
相关产品推荐

