ในการเขียนโปรแกรมแข่งขัน (Competitive Programming) การอ่านอินพุตให้เร็วที่สุดเป็นสิ่งสำคัญยิ่ง บทความนี้สำรวจวิธีการ I/O ต่างๆ ใน Python
โจทย์ตัวอย่าง: อ่านตัวเลข 4 จำนวน แล้วพิมพ์ผลคูณ
วิธีที่ 1: List Comprehension + input()
a, b, c, d = [int(x) for x in input().split()] print(a * b * c * d)
วิธีที่ 2: map() + input()
a, b, c, d = map(int, input().split()) print(a * b * c * d)
ใช้ sys.stdin และ sys.stdout (เร็วกว่ามาก)
วิธีที่ 1a: List Comprehension + stdin/stdout
from sys import stdin, stdout a, b, c, d = [int(x) for x in stdin.readline().rstrip().split()] stdout.write(str(a * b * c * d) + "\n")
โจทย์ INTEST (SPOJ) - Enormous Input Test
อินพุต: n, k (n, k ≤ 10⁷) ตามด้วย n บรรทัดของ ti (ti ≤ 10⁹)
เอาต์พุต: จำนวน ti ที่หาร k ลงตัว
วิธีที่ 1: ใช้ input() ธรรมดา (ช้า)
def main():
n, k = [int(c) for c in input().split()]
cnt = 0
for _ in range(n):
t = int(input())
if t % k == 0:
cnt += 1
print(cnt)
if __name__ == "__main__":
main()
วิธีที่ 2: ใช้ stdin.readline() (เร็วกว่า)
from sys import stdin, stdout
def main():
n, k = [int(c) for c in stdin.readline().split()]
cnt = 0
for _ in range(n):
t = int(stdin.readline())
if t % k == 0:
cnt += 1
stdout.write(str(cnt))
if __name__ == "__main__":
main()
วิธีที่ 3: อ่านทั้งหมดครั้งเดียวด้วย stdin.readlines() (เร็วที่สุด)
from sys import stdin, stdout
def main():
n, k = map(int, stdin.readline().split())
cnt = 0
lines = stdin.readlines()
for line in lines:
if int(line) % k == 0:
cnt += 1
stdout.write(str(cnt))
if __name__ == "__main__":
main()
สรุปความเร็ว
- ช้าที่สุด:
input()ในลูป - ปานกลาง:
stdin.readline()ในลูป - เร็วที่สุด:
stdin.readlines()อ่านทั้งหมดครั้งเดียว แล้วประมวลผล
เคล็ดลับเพิ่มเติม: ใช้ sys.stdin.buffer.read() แล้ว split ด้วย bytes สำหรับความเร็วสูงสุด