Movatterモバイル変換


[0]ホーム

URL:


Open In App
Next Article:
Input and Output in Python
Next article icon

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 isx. Usually, in Java time provided is2x,and inPython, it's5x. 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 ofN numbers inputted from the user. 
Input a numberN
InputN 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 inPython:

  • Normal Method
  • Faster Method using Inbuilt Function
  • Taking User Input Given in a Single Line in Separate Variables
  • Taking User Inputs of List of Integers
  • Taking String Input from the User
  • Adding a buffered pipe io (Python 2.7) 

Normal Method Python (Python 2.7)

  • raw_input() takes an optional prompt argument. It also strips the trailing newline character from the string it returns. 
  • print is just a thin wrapper that formats the inputs (space between args and newline at the end) and calls the write function of a given object. 
Python3
# input Nn=int(input())# input the arrayarr=[int(x)forxininput().split()]# initialize variablesummation=0# calculate sumforxinarr:summation+=x# print answerprint(summation)

Faster Method Using Inbuilt stdin, stdout (Python 2.7)

  • sys.stdin on the other hand is aFile Object. It is like creating any other file object one could create to read input from the file. In this case, the file will be a standard input buffer. 
  • stdout.write('D\n') is faster thanprint 'D'
  • Even faster is to write all once bystdout.write("".join(list-comprehension)) but this makes memory usage dependent on the size of the input.  
Python3
fromsysimportstdin,stdout# suppose a function called main() and# all the operations are performeddefmain():# input via readline methodn=stdin.readline()# array input similar methodarr=[int(x)forxinstdin.readline().split()]#initialize variablesummation=0# calculate sumforxinarr: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 inputstdout.write(str(summation))# call the main methodif__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 asget_ints() as given below in the code

Python3
importsysdefget_ints():returnmap(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 theget_ints() function in order to take input in this form. In the functionget_ints we are using themapfunction.

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 namedget_list() as given below.

Python3
importsysdefget_ints():returnlist(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 theget_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 namedget_string() as given below in the code. 

Python3
importsysdefget_string():returnsys.stdin.readline().strip()string=get_string()

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

Adding a buffered pipe io (Python 2.7) 

  • Simply,adding the buffered IO code before your submission code to make the output faster. 
  • The benefit ofio.BytesIO objects is that they implement a common interface (commonly known as a 'file-like' object).BytesIO objects have an internal pointer and for every call to read(n) the pointer advances. 
  • Theatexit module provides a simple interface to register functions to be called when a program closes down normally. Thesys module also provides a hook, sys.exitfunc, but only one function can be registered there. Theatexit registry can be used by multiple modules and libraries simultaneously.  
Python3
# import libraries for input/ output handling# on generic levelimportatexit,io,sys# A stream implementation using an in-memory bytes# buffer. It inherits BufferedIOBase.buffer=io.BytesIO()sys.stdout=buffer# print via here@atexit.registerdefwrite():sys.stdout.write(buffer.getvalue())###################################### template endsn=int(input())# input the arrayarr=[int(x)forxininput().split()]# initialize variablesummation=0# calculate sumforxinarr:summation+=x# print answerprint(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 theraw_input() with Python 3.X'sinput() syntax. Rest should work fine.

References


K

kartik
Improve

Similar Reads

We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood ourCookie Policy &Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences

[8]ページ先頭

©2009-2025 Movatter.jp