Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python I/O สำหรับการเขียนโปรแกรมแข่งขัน (Competitive Programming)

ในการเขียนโปรแกรมแข่งขัน (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()

สรุปความเร็ว

  1. ช้าที่สุด: input() ในลูป
  2. ปานกลาง: stdin.readline() ในลูป
  3. เร็วที่สุด: stdin.readlines() อ่านทั้งหมดครั้งเดียว แล้วประมวลผล

เคล็ดลับเพิ่มเติม: ใช้ sys.stdin.buffer.read() แล้ว split ด้วย bytes สำหรับความเร็วสูงสุด