You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python单行输入逐元素读取方法问询(内存超限优化场景)

Fixing Memory Overflow with Large Inputs in Python

Hey, I’ve dealt with this exact problem when working with huge datasets in Python—your initial code works for small test cases, but it’s no match for 1e6 elements because it loads everything into memory at once. Let’s break down how to solve this by reading elements one at a time without storing the entire sequence.

Why Your Original Code Fails

  • list(map(int, input().split())) creates a full list of all integers. For 1e6 elements, Python’s integer objects take up way more than the 32MB memory limit (each int in Python has significant overhead beyond just the value itself).
  • Calling input() for a massive single line loads the entire line into memory, which can trigger timeouts or memory errors before you even start processing.

Solutions to Read Elements Incrementally

Method 1: Chunked Input Stream Processing (Most Robust)

This approach reads the input in small chunks, parses numbers as we go, and never stores the entire dataset. It’s perfect for ultra-large inputs:

import sys

def count_matching_first():
    target = None
    match_count = 0
    buffer = ""
    
    # Read input in chunks instead of all at once
    for chunk in sys.stdin:
        buffer += chunk
        # Process as many complete numbers as we can from the buffer
        while True:
            # Find the next whitespace separator
            space_idx = buffer.find(" ")
            newline_idx = buffer.find("\n")
            split_idx = min(idx for idx in [space_idx, newline_idx] if idx != -1) if (space_idx != -1 or newline_idx != -1) else -1
            
            if split_idx == -1:
                break  # No more complete numbers in buffer
            
            num_str = buffer[:split_idx].strip()
            if num_str:
                num = int(num_str)
                if target is None:
                    target = num  # Set the first element as our target
                else:
                    if num == target:
                        match_count += 1
            
            # Trim the processed part from the buffer
            buffer = buffer[split_idx + 1:]
    
    # Handle the last remaining number in the buffer
    if buffer.strip() and target is not None:
        final_num = int(buffer.strip())
        if final_num == target:
            match_count += 1
    
    print(match_count)

count_matching_first()

Method 2: Generator-Based Element Iteration (Simpler, but Watch for Long Lines)

If your input is split across multiple lines (or you’re confident lines aren’t excessively long), a generator can yield elements one by one without storing the whole list:

import sys

def stream_numbers():
    # Yield integers one at a time from input lines
    for line in sys.stdin:
        for num_str in line.split():
            yield int(num_str)

def count_matching_first():
    num_stream = stream_numbers()
    target = next(num_stream)  # Grab the first element
    match_count = 0
    
    for num in num_stream:
        if num == target:
            match_count += 1
    
    print(match_count)

count_matching_first()

Note: If your input is a single extremely long line, line.split() will still create a list of all elements from that line, which could hit the memory limit. Stick with the chunked method for that scenario.

内容的提问来源于stack exchange,提问作者VictorMinsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:43:51