2012-04-25 87 views
2

几个月前我开始学习编程,最近刚刚发现了codechef
问题是,对于使用大量输入的问题,我的代码alwaqys超出了时间限制。我似乎无法使input test工作。从codechef在Python中处理大型输入

描述:

输入

输入开始于两个正整数n K(N,K = < 10^7)。接下来的n行输入包含一个正整数ti,每个输入不大于 10^9。

输出

写入单个整数输出,表示TI多少整数是 整除k个。

下面的代码:

n, t = [int(x) for x in input().split()] 
c = 0 
for i in range(n): 
    if not int(input()) % t: 
     c += 1 
print(c) 

我不知道我错过了什么。我怎样才能更快处理?

+0

可以粘贴输入? – 2012-04-25 18:15:46

+0

@AshwiniChaudhary:你的意思是全部20MB?问题被称为“巨大的输入测试” – 2012-04-25 18:17:45

+0

@agf是的。程序必须从标准输入读取并写入标准输出。 – 2012-04-25 18:23:28

回答

5

这确实应该是一个评论,但不管怎么说。

请注意,有一个公认的Python 2解决方案here,运行时45.77s,所以很显然可能。我认为你是Python 3慢速I/O的受害者(看起来他们正在使用3.1.2)。在一个200万行的输入文件中(这个文件没有任何可以被整除的数字):在很多情况下没有多少区别),在修改为与2和3兼容的代码版本中,我得到:

~/coding$ time python2.6 enormread.py < sample.txt 
0 

real 0m3.971s 
user 0m3.712s 
sys 0m0.256s 
~/coding$ time python2.7 enormread.py < sample.txt 
0 

real 0m2.637s 
user 0m2.428s 
sys 0m0.204s 
~/coding$ time python3.2 enormread.py < sample.txt 
0 

real 0m10.412s 
user 0m10.065s 
sys 0m0.344s 
~/coding$ time ~/sys/Python-3.3.0a2/python enormread.py < sample.txt 
0 

real 0m6.776s 
user 0m6.336s 
sys 0m0.436s 
~/coding$ time pypy enormread.py < sample.txt 
0 

real 0m2.211s 
user 0m1.948s 
sys 0m0.028s 

要扔@ AGF的(sum(not int(line) % t for line in sys.stdin[.buffer]))混进去:

~/coding$ time python2.7 enormfast.py < sample.txt 
0 

real 0m1.454s 
user 0m1.436s 
sys 0m0.016s 
~/coding$ time python3.2 enormfast.py < sample.txt 
0 

real 0m2.243s 
user 0m2.228s 
sys 0m0.012s 
+0

就是这样。我和其他人的代码大致相同,当我用2.5运行时,它会及时完成。 – 2012-04-25 19:03:34

+0

很好的编辑。如果我能的话,另一个+1。很高兴看到我写的代码很重要。实际上,我很惊讶地看到Python 2.7和3.2之间的很大区别,但是有很多事情正在发生,I/O更改,生成器表达式更改等等。 – agf 2012-04-25 19:50:06

0

在Python中,你可以尝试通过添加以下两行到文件的开始加快您的解决方案:

import psyco 
psyco.full() 

http://www.codechef.com/wiki/faq#Why_do_I_get_a_Time_Limit_Exceeded

+0

在这种情况下它没有任何区别。它运行在大致相同的时间,有或没有它。看起来,在这种情况下,瓶颈是python 3的IO慢,因为它实际上与2.5 – 2012-04-25 19:01:37

+0

一起工作,心理是死的,python 3.1没有它。 – alicelieutier 2013-04-22 22:53:46

2

看来,测试是不可能使用python3因为它的速度较慢IO性能运行。以下是我可以编写的最快的代码。回顾几个月的结果,这似乎是最快的Python解决方案。 使用len()大约是@agf推荐的sum()的3倍。


python2.5: 8.28s 

import sys 
import psyco 
psyco.full() 

def main(): 
    n, k = map(int,sys.stdin.readline().split()) 
    print len([x for x in sys.stdin if not int(x) % k]) 

main()