在python中处理大型输入

在python中处理大型输入,python,io,Python,Io,我几个月前开始学习编程,最近才发现。 问题是,在使用大量输入的问题上,我的代码总是超出时间限制。我似乎连工作都做不到 codechef中的说明: 输入 输入以两个正整数n k(n,k)开始 在Python中,您可以尝试通过在文件开头添加以下两行来加速解决方案: import psyco psyco.full() 这应该是一个评论,但无论如何 请注意,有一个公认的Python2解决方案,运行时为45.77s,因此这显然是可能的。我认为您是Python3缓慢I/O的受害者(看起来他们使用的是3.1

我几个月前开始学习编程,最近才发现。
问题是,在使用大量输入的问题上,我的代码总是超出时间限制。我似乎连工作都做不到

codechef中的说明:

输入

输入以两个正整数n k(n,k)开始 在Python中,您可以尝试通过在文件开头添加以下两行来加速解决方案:

import psyco
psyco.full()

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

请注意,有一个公认的Python2解决方案,运行时为45.77s,因此这显然是可能的。我认为您是Python3缓慢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

由于python3的IO性能较慢,因此似乎无法使用它运行测试。下面是我能写的最快的代码。回顾几个月的结果,这似乎是最快的python解决方案。 使用len()的速度大约是@agf建议的sum()速度的3倍



你能粘贴输入吗?@AshwiniChaudhary:你是说全部20MB?这个问题被称为“巨大的输入测试”@agf是的。程序必须从standart输入读取数据,然后写入standart输出。“巨大的输入测试”不是Python适合的地方。为什么不在这些简单的程序中使用C或其他语言,而在其他更有趣的问题中使用Python,在这些问题中,算法的实际思想比处理速度更重要?@g NiklasB。我认为思考在这里是很重要的——像
sum(而不是sys.stdin中line的int(line)%t)
可能要快得多。在Python3上,还可以使用
sys.stdin.buffer
来获得Python2的性能。“Python很慢”的想法在实际应用中并不完全正确,在这种情况下没有任何区别。不管有没有它,它的运行时间大致相同。在本例中,瓶颈似乎是Python3的IO速度慢,因为它使用的是2.5版本。我和其他人的代码大致相同,当我用2.5运行它时,它会及时完成。编辑得不错。如果可以的话,再加一个+1。很高兴看到我是对的,你如何编写代码很重要。看到Python2.7和3.2之间有这么大的差异,我确实有点惊讶,但是有很多事情在进行,I/O更改、生成器表达式更改等等。
~/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
~/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
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()