2012-04-25 56 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()