Open In App

Python Input Methods for Competitive Programming

Python is an amazingly user-friendly language with the only flaw of being slow. In comparison to C, C++, and Java, it is quite slower. In online coding platforms, if the C/C++ limit provided is x. Usually, in Java time provided is 2x, and in Python, it’s 5x. To improve the speed of code execution for input/output intensive problems, languages have various input and output procedures. In this article, we are going to see various Python input methods for competitive programming.

Example Problem 

Consider a question of finding the sum of N numbers inputted from the user. 
Input a number N
Input N numbers are separated by a single space in a line. 

Example

Input: 
5
1 2 3 4 5
Output:
15

Input Methods for Competitive Programming in Python

Below are the methods by which we can take faster input in Python:

Normal Method Python (Python 2.7)




# input N
n = int(input())
 
# input the array
arr = [int(x) for x in input().split()]
 
# initialize variable
summation = 0
 
# calculate sum
for x in arr:
    summation += x
     
# print answer
print(summation)

Faster Method Using Inbuilt stdin, stdout (Python 2.7)




from sys import stdin, stdout
 
# suppose a function called main() and
# all the operations are performed
def main():
 
    # input via readline method
    n = stdin.readline()
 
    # array input similar method
    arr = [int(x) for x in stdin.readline().split()]
 
    #initialize variable
    summation = 0
     
    # calculate sum
    for x in arr:
        summation += x
 
    # could use inbuilt summation = sum(arr)
 
    # print answer via write
    # write method writes only
    # string operations
    # so we need to convert any
    # data into string for input
    stdout.write(str(summation))
 
# call the main method
if __name__ == "__main__":
    main()   

Difference in Time

Timing summary (100k lines each) 
——————————– 
Print : 6.040 s 
Write to file : 0.122 s 
Print with Stdout : 0.121 s

As we have seen till now that taking input from the standard system and giving output to the standard system is always a good idea to improve the efficiency of the code which is always a need in Competitive programming. But wait! would you like to write these long lines every time when you need them? Then, what’s the benefit of using Python. 
Let’s discuss the solution to this problem. What we can do is let’s create separate functions for taking inputs of various types and just call them whenever you need them. 

Taking User Input Given in a Single Line in Separate Variables

Suppose the input is of the following form 

5 7 19 20

We want separate variables to reference them. What we want is given below

a = 5
b = 7
c = 19
d = 20

To do this, we can create a function named as get_ints() as given below in the code




import sys
def get_ints(): return map(int, sys.stdin.readline().strip().split())
 
a,b,c,d = get_ints()

Now we don’t need to write this line again and again. You just have to call the get_ints() function in order to take input in this form. In the function get_ints we are using the map function.

Taking User Inputs of List of Integers

Suppose the input is of the following form 

1 2 3 4 5 6 7 8

Now, we want that a single variable will hold the whole list of integers. What we want is given below.

Arr = [1, 2, 3, 4, 5, 6, 7, 8]

Here we will create a function named get_list() as given below.




import sys
def get_ints(): return list(map(int, sys.stdin.readline().strip().split()))
 
Arr = get_ints()

Now you don’t have to write this line again and again. You just have to call the get_ints() function in order to take input in this form 

Taking String Input from the User

Suppose the input is of the following form  

GeeksforGeeks is the best platform to practice Coding.

Now, we want that a single reference variable will hold this string. What we want is given below

string = "GeeksforGeeks if the best platform to practice coding."

Here we will create a function named get_string() as given below in the code. 




import sys
def get_string(): return sys.stdin.readline().strip()
 
string = get_string()

Now you don’t have to write this line again and again. You just have to call the get_string() function in order to take input in this form

Adding a buffered pipe io (Python 2.7) 




# import libraries for input/ output handling
# on generic level
import atexit, io, sys
 
# A stream implementation using an in-memory bytes
# buffer. It inherits BufferedIOBase.
buffer = io.BytesIO()
sys.stdout = buffer
 
# print via here
@atexit.register
def write():
    sys.stdout.write(buffer.getvalue())
 
#####################################
# template ends
 
n = int(input())
 
# input the array
arr = [int(x) for x in input().split()]
 
# initialize variable
summation = 0
 
# calculate sum
for x in arr:
    summation += x
 
# print answer
print(summation)

Summary

While handling a large amount of data usually, the normal method fails to execute within the time limit. Method 2 helps in maintaining a large amount of I/O data. Method 3 is the fastest. Usually, handling of input data files greater than 2 or 3 MBs is helped via methods 2 and 3.
Note: above mention codes are in Python 2.7, to use in Python 3.X versions. Simply replace the raw_input() with Python 3.X’s input() syntax. Rest should work fine.

References


Article Tags :