处理python中的大型输入

时间:2012-04-25 18:11:37

标签: python io

几个月前我开始学习编程,最近才发现codechef 问题是,对于使用大量输入的问题,我的代码超出了时间限制。我甚至无法使input test工作。

codechef的说明:

  

输入

     

输入以两个正整数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)

我不确定我错过了什么。我怎样才能更快地处理这个?

3 个答案:

答案 0 :(得分:5)

这应该是一个评论,但无论如何。

请注意,有一个可接受的Python 2解决方案here,运行时为45.77,因此显然可行。我认为你是Python 3缓慢I / O的受害者(看起来他们正在使用3.1.2)。在一个200万行输入文件(它没有任何可分割的数字):当有很多时没有太大区别),在你的代码版本修改为与2和3兼容时,我得到:< / p>

~/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

答案 1 :(得分: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()

答案 2 :(得分:0)

  

在Python中,您可以尝试通过在文件的开头添加以下两行来加速解决方案:

import psyco
psyco.full()

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