ในที่นี้ เราจะมาดูวิธีต่างๆ ของวิธี I/O สำหรับการเขียนโปรแกรมเชิงแข่งขันใน Python ในการเขียนโปรแกรมเชิงแข่งขัน สิ่งสำคัญคือต้องอ่านข้อมูลให้เร็วที่สุดเท่าที่จะเป็นไปได้ เพื่อที่จะได้เปรียบเหนือผู้อื่น
สมมติว่าคุณอยู่ใน codeforces หรือ jude ออนไลน์ที่คล้ายกัน (เช่น SPOJ) และคุณต้องอ่านตัวเลข a, b, c, d และพิมพ์ผลิตภัณฑ์ของพวกเขา มีหลายวิธีที่จะทำ มาสำรวจกันทีละคน
วิธีหนึ่งในการทำคือผ่านรายการความเข้าใจและฟังก์ชันแผนที่
วิธีที่ 1 :การใช้ความเข้าใจรายการ
a, b, c, d = [int(x) for x in input().split()] print(a*b*c*d)
วิธีที่ 2 :การใช้ฟังก์ชันแผนที่
a, b, c, d = map(int, input().split()) print(a*b*c*d)
อีกวิธีในการแก้ไขปัญหาข้างต้นคือการใช้ stdin และ stdout ซึ่งเร็วกว่ามาก
วิธีที่ 1 ก :แสดงรายการความเข้าใจด้วย 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-Enormous Input Test บน SPOJ
ป้อนข้อมูล
อินพุตเริ่มต้นด้วยจำนวนเต็มบวกสองตัว nk (n, k<=10 7 ). อินพุต n บรรทัดถัดไปมีหนึ่งจำนวนเต็มบวก ti ไม่เกิน 10 9 ละ.
ผลผลิต
เขียนจำนวนเต็มเดียวไปยังเอาต์พุต แสดงว่ามีจำนวนเต็ม ti หารด้วย k ลงตัวกี่ตัว
ที่ไหน
-
อินพุต :อินพุตเริ่มต้นด้วยจำนวนเต็มบวกสองตัว n และ k (โดยที่ n, k <=10) อินพุตบรรทัดถัดไปประกอบด้วยจำนวนเต็มบวกหนึ่งจำนวน t ไม่เกิน 10*9 แต่ละจำนวน
-
ผลลัพธ์ :จำนวนเต็มเดียวที่กำหนดจำนวนเต็ม t หารด้วย k ลงตัว
ตัวอย่างเช่น
Input 7 3 1 51 966369 7 9 999996 11 Output 4
วิธีที่ 1
วิธีหนึ่งในการแก้ปัญหาข้างต้นอยู่ด้านล่างแม้ว่าจะไม่ใช่วิธีที่มีประสิทธิภาพ
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 และ stdout โปรแกรมด้านล่างทำงานเร็วกว่ามากเมื่อเทียบกับโปรแกรมก่อนหน้า
from sys import stdin, stdout def main(): n, k = [int(c) for c in input().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 และ stdout (คล้ายกับวิธีที่เราใช้ในวิธีที่ 2) อย่างไรก็ตาม อ่านอินพุตทั้งหมดพร้อมกันและโหลดลงในรายการพี>
def main(): for sys import stdin, stdout n, k = stdin.readline().split() n = int(n) k = int(k) cnt = 0 lines = stdin.readlines() for line in lines: if int(line) % k == 0: cnt += 1 stdout.write(str(cnt)) if __name__ == "__main__": main()