Python是一种非常人性化的语言,唯一的缺点就是速度慢。与C,C++和Java相比,它要慢得多。在在线编码平台上,如果提供的C/C++时间为X。通常,在Java中提供的时间为2X,而Python的时间为5X。
为了提高输入/输出密集型问题的代码执行速度,语言具有各种输入和输出过程。
一个示例问题:
考虑一个寻找从用户输入的N个数字之和的问题。
输入数字N。
输入N个数字,并在一行中用一个空格隔开。
例如:
Input : 51 2 3 4 5Output :15
针对上述问题的不同Python解决方案:
普通方法Python:(Python 2.7)
1)raw_input()采用可选的提示参数。它还将从返回的字符串中删除结尾的换行符。
2)print只是一个很薄的包装器,它格式化输入(结尾是args和newline之间的空格)并调用给定对象的write函数。
# 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)
使用内置的stdin,stdout的方法快一点:(Python 2.7)
1)sys.stdin是一个文件对象。就像创建可以创建的其他文件对象以读取文件的输入一样。在这种情况下,文件将是标准输入缓冲区。
2)stdout.write('D n')比print‘D’更快。
3)更快的方法是通过stdout.write(“”.join(list-comprehension))一次写入所有内容,但这使内存使用量取决于输入的大小。
# 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()
时间差:
Timing summary (100k lines each)——————————–Print : 6.040 sWrite to file : 0.122 sPrint with Stdout : 0.121 s
添加缓冲管道io:(Python 2.7)
1)只需在提交代码之前添加缓冲的IO代码,以加快输出速度。
2)io.BytesIO对象的好处是它们实现了一个通用的接口(通常称为“类文件”对象)。BytesIO对象具有内部指针,并且每次调用read(n)时指针都会前进。
3)atexit模块提供了一个简单的接口来注册程序正常关闭时要调用的功能。sys模块还提供了一个挂钩sys.exitfunc,但是只能在其中注册一个功能。atexit注册表可以同时由多个模块和库使用。
# 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)
通常,在处理大量数据时,普通方法无法在时限内执行。方法2帮助维护大量的I/O数据。方法3是最快的。通常,通过方法2和3帮助处理大于2、3MB的输入数据文件。
注意:上面提到的代码适用于Python 2.7,要在Python 3.X版本中使用,只需使用Python 3.X的input()语法替换raw_input()即可。