User Tools

Site Tools


python3:input_output

Input and Output

There is no magic bullet that leads to the fastest input and output in a programming contest. Having said this, there are typically multiple ways of performing and processing input and output in Python3. By understanding the options that are available and how to optimize them (e.g., conducting tests) you can see a real world performance increase, in particular when faced with high volumes of reads and writes.

Input Basics

Input in Python3 is handled via the input() function, and reads a newline-terminated string from standard input.1) Any additional processing is done to the resulting string.

>>> x = input()
Hello World! # x="Hello World!"
>>> x = int(input())
42 # x=42
>>> x = input().split()
Hello World! # x=["Hello", "World!"]
>>> (x, y) = map(int, input().split())
1 2 # x=1, y=2

map() applies a function across a sequence or iterable structure. The comma , unpacks the map object into x and y.

>>> x = list(map(float, input().split()))
1.2 2.3 3.4 4.5 # x=[1.2, 2.3, 3.4, 4.5]

Output Basics

Output is handled with the print() function.

>>> print() # '\n'
>>> print("Hello World!") # "Hello World!\n"
>>> print("Hello", "World!") # "Hello World!\n"
>>> print(1, 2, 3, sep='') # "123\n"
>>> print(1, 2, 3, end='-')
>>> print("a b c") # "1 2 3-a b c\n"

Advanced Input

input() will scale well for many easy and mid-level contest problems. For mid to upper problems with significant bounds on reads and writes input() will carry an increased risk of time limit exceeded judgements.2)

stdin.readline()

readline() is identical to the interface provided by input() except it retains the \n that is used to terminate the read.3)

>>> from sys import *
>>> x = stdin.readline()
Hello World! # x="Hello World!\n"

stdin.readlines()

readlines() processes an entire file, terminated by an end of file character.4)

>>> from sys import *
>>> x = stdin.readlines()
Hello
To Everyone! # x=["Hello\n", "To Everyone!\n"]

<ctrl>+d would be used to terminate this example after the !.

readlines() loads and stores an entire file into memory (as a list) its performance will exceed other options in Python3 for all but the most enormous files.5)

Benchmarks

The following benchmarks demonstrate the increased likelihood of failure of input() as input sizes increase. All files used for testing can be found here.

10 characters per line (n= number of lines):

n input() sys.stdin.readline() sys.stdin.readlines()
104 .034s .016s .018s
105 .146s .052s .030s
106 1.301s .301s .130s

1000 characters per line (n= number of lines):

n input() sys.stdin.readline() sys.stdin.readlines()
104 .046s .037s .033s
105 .282s .183s .143s
106 2.728s 1.430s 1.723s6)

The above tests were designed to showcase minimal reading functionality other than temporary storage.7)

1)
Unlike C++ and Java, input is line-based rather than token-based.
2)
There is no guaranteed cutoff, but for many problems input() is increasingly likely to fail around 103n≤104 lines.
3)
This may require special handling in certain circumstance and can be safely ignored in others. E.g., .split() will not behave differently vs. input().
4)
This behavior can be simulated on the terminal with <ctrl>+d.
5)
See the table below for an example where readlines() required storing ∼1GB of data.
6)
The readlines() version is actually slower than readline() on the largest dataset. It is attempting to store about 1GB in memory here, causing a slowdown, but still faster than input().
7)
We deliberately avoided additional processing such as typecasts, map(), and split(), as these are non-IO considerations in Python3.
python3/input_output.txt · Last modified: 2018/08/14 19:04 by jguerin