📜  竞争性编程的Python输入法

📅  最后修改于: 2021-06-26 09:29:50             🧑  作者: Mango

Python是一种非常人性化的语言,唯一的缺点就是速度慢。与C,C++和Java,它要慢得多。在线编码平台(如果提供的C / C++限制为X) 。通常,在Java提供的时间是2X和Python,是5X
为了提高输入/输出密集型问题的代码执行速度,语言具有各种输入和输出过程。

一个示例问题:
考虑一个寻找从用户输入的N个数字之和的问题。
输入数字N。
输入N个数字,并在一行中用一个空格隔开。

例子:

Input : 
5
1 2 3 4 5
Output :
15




针对上述问题的不同Python解决方案:

普通方法Python:(Python 2.7)
1. raw_input()采用可选的提示参数。它还会去除从它返回字符串的结尾字符。
2. print只是一个薄包装器,用于格式化输入(末尾args和换行符之间的空间)并调用给定对象的write函数。

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


Python
# import inbuilt standard input output
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()


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


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


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


Python
# template begins
#####################################
 
# 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
 
# normal method followed
# input N
n = int(raw_input())
 
# input the array
arr = [int(x) for x in raw_input().split()]
 
# initialize variable
summation = 0
 
# calculate sum
for x in arr:
    summation += x
 
# print answer
print(summation)


使用内置的stdin,stdout的方法快一点:(Python 2.7)
另一方面, sys.stdin是一个File Object 。就像创建可以创建的其他文件对象以读取文件的输入一样。在这种情况下,文件将是标准输入缓冲区。
2. stdout.write(’D \ n’)打印’D’快。
3.更快的方法是通过stdout.write(“”。join(list-comprehension))一次写入所有内容,但这使内存使用量取决于输入的大小。

Python

# import inbuilt standard input output
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()   

时间差:

到目前为止,我们已经看到从标准系统获取输入并将输出提供给标准系统始终是提高代码效率的好主意,这在竞争性编程中始终是必需的。可是等等!您是否想在需要时每次都写这些长行?然后,使用Python什么好处。
让我们讨论这个问题的解决方案。我们能做的是让我们创建单独的函数来获取各种类型的输入,并在需要时随时调用它们。

当您要输入单行中给定的特定整数整数的输入时

假设输入具有以下形式

5 7 19 20




并且我们想要单独的变量来引用它们。我们想要的是:

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




因此,我们可以创建一个名为get_ints()的函数,如下所示:

Python3

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

现在,您不必一次又一次地写此行。您只需要调用get_ints()函数即可以这种形式进行输入。在函数get_ints中,我们使用map函数。

当您要输入一行中给出的整数列表时

假设输入具有以下形式

1 2 3 4 5 6 7 8




并且我们希望单个变量将包含整个整数列表。我们想要的是:

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




因此,在这里我们将创建一个名为get_list()的函数,如下所示:

Python3

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

现在,您不必一次又一次地写此行。您只需要调用get_ints()函数即可以这种形式进行输入

当您想输入字符串

假设输入具有以下形式

GeeksforGeeks is the best platform to practice Coding.




并且我们希望单个引用变量将包含此字符串。我们想要的是:

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




所以,在这里我们将创建一个命名为get_string(函数)如下:

Python3

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

现在,您不必一次又一次地写此行。您只需要调用get_string()函数即可以这种形式进行输入
添加缓冲管道io:(Python 2.7)
1.只需在提交代码之前添加缓冲的IO代码,以加快输出速度。
2. io.BytesIO对象的好处是它们实现了一个公共接口(通常称为“类文件”对象)。 BytesIO对象具有内部指针,并且每次调用read(n)时指针都会前进。
3. atexit模块提供了一个简单的界面,用于注册程序正常关闭时要调用的功能。 sys模块还提供了一个钩子sys.exitfunc,但是只能在其中注册一个函数。 atexit注册表可以同时由多个模块和库使用。

Python

# template begins
#####################################
 
# 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
 
# normal method followed
# input N
n = int(raw_input())
 
# input the array
arr = [int(x) for x in raw_input().split()]
 
# initialize variable
summation = 0
 
# calculate sum
for x in arr:
    summation += x
 
# print answer
print(summation)