0Pricing
Competitive Programming Academy · บทเรียน

ศึก input() ปะทะ sys.stdin

เหตุใด input() แบบธรรมดาจึงทำให้เสียเวลาเมื่อมี tests ขนาดใหญ่

ศึก input() ปะทะ sys.stdin เป็นบทเรียน Competitive Programming Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Competitive Programming Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน

ต้นทุนแฝงของ input()

การเรียก input() แต่ละครั้งทำงานเพิ่มเติมเบื้องหลัง สำหรับข้อมูลไม่กี่บรรทัด เรื่องนี้ไม่เป็นปัญหา แต่การแข่งขันอาจมีข้อมูลหลายพันบรรทัดให้คุณอ่าน ⏱️

เหตุผลที่เวลาสะสม

สาเหตุที่ช้าลงคือค่าใช้จ่ายต่อการเรียก เพราะข้อความแจ้งเตือน การล้างบัฟเฟอร์ และการตรวจสอบการเข้ารหัสจะเกิดซ้ำในทุกบรรทัดที่คุณอ่าน

พบกับ sys.stdin

วิธีที่เร็วขึ้นคืออ่านข้อมูลจาก sys.stdin ซึ่งเป็นสตรีมข้อมูลขาเข้าโดยตรง วิธีนี้ข้ามส่วนอำนวยความสะดวกเพิ่มเติมที่ input() จัดการให้คุณ

import sys
data = sys.stdin

อ่านหนึ่งบรรทัดอย่างรวดเร็ว

ใช้ sys.stdin.readline() เพื่อดึงข้อมูลหนึ่งบรรทัดอย่างรวดเร็ว การทำงานคล้าย input() แต่มีค่าใช้จ่ายต่อการเรียกน้อยกว่ามาก

import sys
line = sys.stdin.readline()

ใส่ใจกับอักขระขึ้นบรรทัดใหม่

readline() จะเก็บอักขระขึ้นบรรทัดใหม่ที่อยู่ท้ายบรรทัดไว้ ให้เรียก .strip() เพื่อลบอักขระนั้นก่อนแยกวิเคราะห์ค่า

n = int(sys.stdin.readline().strip())

อ่านข้อมูลทั้งหมดในครั้งเดียว

หากต้องการอ่านให้เร็วที่สุด ให้ดึงข้อมูลขาเข้าทั้งหมดในครั้งเดียวด้วย sys.stdin.read() แล้วประมวลผลข้อความด้วยตัวเอง

data = sys.stdin.read()

แยกข้อมูลทั้งหมด

หลังจาก read() ให้เรียก .split() เพื่อเปลี่ยนโทเค็นทั้งหมดให้เป็นรายการแบนหนึ่งรายการ ช่องว่างและอักขระขึ้นบรรทัดใหม่จะถูกจัดการพร้อมกัน

tokens = sys.stdin.read().split()

กำหนด input ใหม่เพื่อเพิ่มความเร็ว

เทคนิคทั่วไปคือกำหนดให้ input ชี้ไปยัง readline เพื่อให้โค้ดเดิมยังเหมือนเดิม แต่ทำงานได้เร็วขึ้น

import sys
input = sys.stdin.readline

เมื่อ input() ก็เพียงพอแล้ว

หากโจทย์อ่านข้อมูลเพียงไม่กี่บรรทัด การใช้ input() แบบปกติก็เพียงพออย่างสมบูรณ์ ควรเก็บวิธีที่เร็วกว่าไว้สำหรับข้อมูลขนาดใหญ่

print ก็มีค่าใช้จ่ายเช่นกัน

แนวคิดเดียวกันนี้ใช้กับข้อมูลขาออก การเรียก print() หลายพันครั้งทำงานช้า เราจะจัดการเรื่องนี้ในบทเรียนถัดไปเกี่ยวกับการรวมข้อมูลเป็นชุด

เลือกเครื่องมือให้เหมาะสม

กฎทั่วไปคือ ข้อมูลขนาดเล็กให้ใช้ input() ส่วนข้อมูลขนาดใหญ่ให้เปลี่ยนไปใช้ sys.stdin การเลือกเครื่องมือให้เหมาะกับ N ช่วยรักษาคะแนนของคุณ

ตรวจสอบอย่างรวดเร็ว

ลองตรวจสอบความรู้สึกเบื้องต้นเกี่ยวกับความเร็วในการอ่านข้อมูล

ทบทวน: การอ่านอย่างรวดเร็ว

คุณได้รู้จัก sys.stdin ในฐานะทางเลือกที่เร็วกว่า input(): ใช้ readline() ทีละบรรทัด หรือใช้ read().split() เพื่ออ่านทั้งหมด เลือกเครื่องมือให้เหมาะกับขนาดข้อมูลขาเข้า ⚡

คำถามที่พบบ่อย

บทเรียน “ศึก input() ปะทะ sys.stdin” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ศึก input() ปะทะ sys.stdin” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Competitive Programming Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ศึก input() ปะทะ sys.stdin”

เหตุใด input() แบบธรรมดาจึงทำให้เสียเวลาเมื่อมี tests ขนาดใหญ่ คุณปฏิบัติ Competitive Programming Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Competitive Programming Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Competitive Programming Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ศึก input() ปะทะ sys.stdin” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Competitive Programming Academy นี้ได้ไหม

ได้ บทเรียน Competitive Programming Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ศึก input() ปะทะ sys.stdin
  2. แยกตัวเลขจำนวนมากในบรรทัดเดียว
  3. ส่งข้อมูลออกเป็นชุดอย่างถูกวิธี
  4. อ่าน N บรรทัดและกรณีขอบ
← กลับไปที่ Competitive Programming Academy