1

为了快速读取整数,我一直在使用

cases = int(next(sys.stdin))

而不是较慢的

cases = int(sys.stdin.readline())

在我使用这个的每一个问题中,我都得到了更好的时机,但是在这个 SPOJ 问题相同的 codechef 问题的情况下,我使用第二个而不是第一个得到了更好的结果。我不知道为什么会这样。

对于这个特定问题,与第一种方法相比,第二种方法突然变得更快的原因是什么?

这里是 SPOJ 的Timing 结果和 codechef计时结果

我使用的 2 个完整代码是

import sys
from itertools import islice
def p():
    cases = int(next(sys.stdin))
    string = [i[:len(i) -1] for i in islice(sys.stdin, cases)]
    for i in string:
        ops, ans = [], []
        for c in i:
            if c in ['+', '-', '*', '/', '^']:
                ops.append(c)
            elif c == ')':
                ans.append(ops.pop())
            elif c == '(':
                pass
            else:
                ans.append(c)

        print ''.join(ans)

p()

第二个是

import sys
from itertools import islice
def p():

    cases = int(sys.stdin.readline())
    string = [i[:len(i) -1] for i in islice(sys.stdin, cases)]
    for i in string:
        ops, ans = [], []
        for c in i:
            if c in ['+', '-', '*', '/', '^']:
                ops.append(c)
            elif c == ')':
                ans.append(ops.pop())
            elif c == '(':
                pass
            else:
                ans.append(c)

        print ''.join(ans)

p()
4

1 回答 1

0

您没有足够的关于 SPOJ 计时的数据。编解码器的时间看起来都太接近了,无法打电话给我。

一次 .readline()调用和一次 调用之间的任何时间差异next()都将归结为交换可用性、机器上运行的其他进程、I/O 刷新等方面的差异。换句话说,与两种方法之间的任何实际性能差异无关。

您必须在自己的机器上进行自己的计时,针对数千次运行,才能确定一个是否真的比另一个更快。

于 2013-07-07T11:58:45.017 回答