2012-04-25 4 views
2

Я начал изучать программирование несколько месяцев назад и недавно нашел codechef.
Проблема в том, что при проблемах, которые используют большие объемы ввода, мой код alwaqys превышает лимит времени. Я даже не могу представить работу input test.Обработка больших входов в python

Описание от codechef:

Входной

вход начинается с двух положительных целых чисел п к (п, к < = 10^7). В следующих входных вводах содержатся одно положительное целое число ti, не более 10^9, каждый.

Выход

Написать единое целое для вывода, обозначая, сколько целые числа ти являются делится на к.

Вот код:

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

вы можете вставить ввод? –

+0

@AshwiniChaudhary: Вы имеете в виду все 20 МБ? Проблема называется «Испытание с высоким уровнем входного сигнала» –

+0

@agf Да, это так. Программы должны считывать стандартный вход и записывать в стандартный вывод. –

ответ

5

Это должно быть действительно комментарий, но в любом случае.

Обратите внимание, что есть принятое решение Python 2 here с временем выполнения 45,77 с, поэтому это очевидно. Я думаю, что вы жертва медленного ввода-вывода Python 3 (похоже, что они используют 3.1.2). На двухминутном входном файле линии (который не имеет никаких чисел, которые делятся): нет большой разницы, когда их много), в версии вашего кода, модифицированной для совместимости с 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

Так оно и было. Код Mine и других парней примерно одинаковый, и когда я запускаю его с 2.5, он заканчивается во времени. –

+0

Хорошее редактирование. Еще один, если мог. Рад видеть, что я прав, что вы пишете код. На самом деле я немного удивлен, увидев большую разницу между Python 2.7 и 3.2, но происходит много вещей, с изменениями ввода/вывода, изменениями выражения генератора и т. Д. – agf

0

В Python, вы могли бы попробовать ускорить свои решения, добавив следующие две строки в начало файла:

import psyco 
psyco.full() 

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

+0

В этом случае это не имеет никакого значения. Он работает примерно в одно и то же время с или без него. Похоже, что узким местом в этом случае является медленный IO python 3, поскольку он работает с 2.5 –

+0

на самом деле, психо мертв, а python 3.1 не имеет его. – alicelieutier

2

оказывается, что тест невозможно запустить с помощью python3 из-за его медленнее, производительность ввода-вывода. Ниже приведен самый быстрый код, который я мог бы написать. Оглядываясь назад на несколько месяцев, результаты, похоже, являются самым быстрым решением python. Использование len() примерно в 3 раза быстрее, чем sum(), рекомендованное @agf.


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() 
Смежные вопросы