1

我试图解决这个http://www.spoj.pl/problems/INOUTEST/问题。

INPUT:输入的第一行包含一个整数 N (1 ≤ N ≤ 106),表示接下来的行数。这些行中的每一行都包含两个以空格分隔的整数 a 和 b (|a|, |b| ≤ 40,000)。

输出:对于每一对 a 和 b,写一行包含 a × b 值的输出。我的代码运行到 17.03 秒:

import sys
import psyco
psyco.full()

def main():
    s = sys.stdin
    t = int(s.readline())
    for l in s:
        n, m = map(int, l.split())
        print n*m

if __name__ == '__main__':
    main()

然后我变了

t = int(s.readline())

t = s.readline()

一直运行到 16.62 秒。这让我意识到,我将字符串转换为整数的次数越少,我的代码运行速度就越快。最快的解决方案是大约 2.5 秒。我对此很好奇,因为我用 python 解决了 SPOJ 中的所有问题并且我正在努力学习。谢谢你。

4

1 回答 1

1

通过在 for 循环中不使用地图,我设法将您的时间缩短了 4 秒(降至 12.52)。相反,我只是以我能想到的最直接的方式将每一行输入转换为两个整数。

ab = line.split()
a = int(ab[0])
b = int(ab[1])

您的解决方案与我提出的解决方案之间的唯一其他区别是我使用raw_input()而不是s.readline()读取输入的初始行(要遵循的测试用例的数量)。由于这只执行一次,我怀疑它会对运行时间产生可衡量的影响。

于 2012-07-08T13:59:25.100 回答