Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python 3中最快的标准输入/输出IO?_Python_Performance_Io_Python 3.x_Stdin - Fatal编程技术网

python 3中最快的标准输入/输出IO?

python 3中最快的标准输入/输出IO?,python,performance,io,python-3.x,stdin,Python,Performance,Io,Python 3.x,Stdin,我一直在使用Python3.1.2解决SPOJ.pl上的一些问题,一些人对简单问题的快速结果让我想知道是否有更快的方法来处理输入和输出 我试过使用 input() print() 及 或者更确切地说 for line in sys.stdin: #Handle input sys.stdout.write(output) 处理每一行。 我还尝试收集列表中的所有输出,并在处理完所有内容后立即打印 但所有这些都会产生类似的执行时间 有没有更快的方法来处理stdin/out的输入和

我一直在使用Python3.1.2解决SPOJ.pl上的一些问题,一些人对简单问题的快速结果让我想知道是否有更快的方法来处理输入和输出

我试过使用

input()
print()

或者更确切地说

for line in sys.stdin:
    #Handle input
    sys.stdout.write(output)
处理每一行。 我还尝试收集列表中的所有输出,并在处理完所有内容后立即打印

但所有这些都会产生类似的执行时间

有没有更快的方法来处理stdin/out的输入和输出?

可能没有

最后,
print
将调用
sys.stdout.write()
。但由于
print
是一个内置函数,可能是用C实现的,因此它甚至可能比调用
sys.stdout.write()
更快

由于所有IO都必须经过
sys.stdout
返回的对象,这就是瓶颈。
sys.stdin
也是如此

没有什么魔术可以让这更快

如果您需要更快的IO,请尝试以下方法:

  • 改为写入文件
  • 使用缓冲IO(在小型shell脚本中使用
    buffer
    命令的管道标准输出)
  • 使用内存映射文件
  • 确保读取输出的进程能够跟上。例如,DOS控制台相当慢。如果您通过慢速命令传递输出,则可能会阻塞python进程
[EDIT]似乎SPOJ.pl是一个程序员射击网站。在这种情况下,I/O速度不是罪魁祸首:您使用了一个糟糕的算法来解决问题


良好性能和一般性能之间的速度差很容易在10到10万倍之间。通过更改几行代码,我可以使代码在不到5秒的时间内运行,而这在45分钟之前就完成了。

以下可能是最快的:

  • 使用
    os一次读取所有输入。读取(0,一些足够大的数字)

  • 处理输出,将结果收集到一个列表中
    results

  • 使用
    os一次写入所有输出。Write(1,”。join(results))


  • 我记得有一个案例,我注意到
    os.read()
    os.write()
    有时比使用Python I/O更快,但我不记得细节了。

    SPOJ让您在各种编程语言中进行选择。您是否将执行时间与用其他编程语言编写的其他解决方案进行比较

    为了好玩,我为第一个问题(codename
    TEST
    )提交了以下解决方案来比较运行时间

    C++解决方案(G+4.4.2) 看

    结论 我不是100%确定这两种语言都能获得绝对最佳的性能,但是没有太多代码需要优化

    < Python代码的C++和<代码> 0.04代码>代码>测量时间>代码> 0代码>代码>测量。假设提交给两个程序的数字顺序相同,我认为将运行时间与其他语言的解决方案进行比较几乎是毫无意义的(见下一段)


    现在,这只适用于简单的问题。大多数高级问题都需要为问题选择正确的算法,而选择错误的算法会产生严重的后果。在这些情况下,精心制作的Python解决方案可能仍然比精心制作的C++解决方案慢,但好的Python解决方案将击败用任何其他语言编写的一个天真的解决方案。

    我认为,如果人们的结果比你快,原因不在你的I/O填充中,这是我最初的猜测,但对于只需要的问题也是如此。将一些输入直接重定向到输出。这就是我问这个问题的原因。Python3.1.2不是一个用于性能度量的特别好的Python版本。Python3.2.2是Python3的最新版本,在这两个版本之间已经有了许多显著的性能改进。谢谢,尽管我不能在SPOJ.pl上做任何改进,因为我提交了代码,然后在它们的服务器上运行测试用例。让我困惑的是,即使问题可以通过打印输入中的特定内容来解决,人们的执行时间也比我快得多。@while:尝试用C编写解决方案,看看是否可以匹配响应时间。我不知道
    SPOJ.pl
    如何计算运行时,但您可能需要为Python解释器付费,以启动和字节编译您的Python脚本……C语言的速度总是更快,但我正在与其他用Python编写的解决方案进行比较。好吧,这些问题的关键在于,它们不是通过从输入中打印特定的内容来解决的,这就是为什么人们得到更快的执行时间。谢谢,你完全正确,但我没有比较不同的语言。检查Python3.1.2中关于这个问题的解决时间:我所做的只是将输入重定向到输出,但仍然得到0.14,最快的是0.02。这就是为什么我认为可能有一种更快的方法来处理io,这让我有点好奇。这是因为实际程序的输出实际上很短,输入可能很长,但实际上不起作用,因为我不知道输入的长度。@while:只需使用一个足够的数字,如
    100000000
    。在我的机器(python 3.2.2)上进行测试时,速度似乎稍微快一点。由于某些原因,无法在SPOJ(python 3.1.2)上使用它,但还是要感谢。@while:这些主机限制进程的可用内存量并不少见。试着用大小合适的块来阅读。无论如何,您最终将拥有更少的I/O。
    for line in sys.stdin:
        #Handle input
        sys.stdout.write(output)
    
    #include <iostream>
    int main ( int, char** )
    {
         for ( int number=0; (std::cin >> number) && (number != 42); ) {
             std::cout << number << std::endl;
         }
    }
    
    import sys
    for line in sys.stdin:
        number = int(line)
        if number == 42:
            break
        print number