📜  竞争性编程的Python输入法

📅  最后修改于: 2020-05-03 12:48:11             🧑  作者: Mango

Python是一种非常人性化的语言,唯一的缺点就是速度慢。 与C,C++和Java相比,它要慢得多。 在在线编码平台上,如果提供的C / C++限制为X。 通常,在Java中提供的时间是2X和Python,是5X 。
为了提高输入/输出密集型问题的代码执行速度,语言具有各种输入和输出过程。
一个示例问题:
考虑一个寻找从用户输入的N个数字之和的问题。
输入数字N。
输入N个数字,并在一行中用一个空格隔开。
例子:

输入:

 5
 1 2 3 4 5
输出:
 15

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

普通方法Python:(Python 2.7)

1. raw_input()采用可选的提示参数。 它还将从返回的字符串中删除结尾的换行符。

2. print只是一个薄包装器,用于格式化输入(末尾args和换行符之间的空间)并调用给定对象的write函数。

 # 输入输出的基本方法
 # 输入N
  n = int ( raw_input ())
 # 输入数组
  arr = [ raw_input ().split()] x int (x) ().split()]
 # 初始化变量
  summation = 0
 # 计算总和
  for arr: x arr:
      summation + = x
 # 打印结果
  print (summation)

使用内置的stdin,stdout的方法快一点:(

1,Python 2.7) 另一方面, sys.stdin是一个File Object 。 就像创建可以创建的其他文件对象以读取文件的输入一样。 在这种情况下,文件将是标准输入缓冲区。

2. stdout.write(‘D \ n’)比print‘D’快。

3.更快的方法是通过stdout.write(“”。join(list-comprehension))一次写入所有内容,但这使内存使用量取决于输入的大小。

 # 导入内置标准输入输出
  from sys import stdin, stdout
 # 假设一个名为main()的函数和所有操作均已执行
  def main():
     # 通过readline方法输入
      n = stdin.readline()
     # 数组输入类似方法
      arr = [ stdin.readline().split()] x int (x) stdin.readline().split()]
     #初始化变量
      summation = 0
     # 计算总和
      for arr: x arr:
          summation + = x
     # could use inbuilt summation = sum(arr)
     # 打印结果
     # write方法仅写入字符串操作,因此我们需要将任何数据转换为字符串以进行输入
      stdout.write( str (summation))
 # 调用main方法
  if __name__ = = "__main__" :
     main()

时间差:

时序摘要(每条10万行)
————————————
打印:6.040 s
写入文件:0.122 s
使用标准输出打印:0.121 s

添加缓冲管道io:(Python 2.7)

1.只需在提交代码之前添加缓冲的IO代码,以加快输出速度。

2. io.BytesIO对象的好处是它们实现了一个通用接口(通常称为“类文件”对象)。 BytesIO对象具有内部指针,并且每次调用read(n)时指针都会前进。

3. atexit模块提供了一个简单的接口来注册程序正常关闭时要调用的函数。 sys模块还提供了一个挂钩sys.exitfunc,但是只能在其中注册一个函数。 atexit注册表可以同时由多个模块和库使用。

 # 模板开始
 #####################################
 # 导入库以进行通用输入/输出处理
  import atexit, io, sys
 # 使用内存中字节缓冲区的流实现。它继承了BufferedIOBase。
  buffer = io.BytesIO()
  sys.stdout = buffer
 # 通过这里打印
  @atexit .register
  def write():
      sys.__stdout__.write( buffer .getvalue())
 #####################################
 # 模板末端
 # 遵循常规方法
 # 输入N
  n = int ( raw_input ())
 # 输入数组
  arr = [ raw_input ().split()] x int (x) ().split()]
 # 初始化变量
  summation = 0
 # 计算总和
  for arr: x arr:
      summation + = x
 # 打印结果
  print (summation)

通常,在处理大量数据时,普通方法无法在时限内执行。 方法2帮助维护大量的I/O数据。 方法3是最快的。 通常,通过方法2和3帮助处理大于2或3 MB的输入数据文件。
注意:上面提到的代码在Python 2.7中,要在Python 3.X版本中使用。 只需使用Python 3.X的input()语法替换raw_input()即可 。 休息应该很好。