Выполните преобразование шаг за шагом от второго к первому и увидеть, как меняется производительность с каждым шагом.
- Удалить строку. Это приведет к некоторому ускорению, независимо от того, будет ли оно значительным, другое дело. Вычистка излишняя, как было упомянуто вами и THC4k.
- Затем замените цикл for, используя
l.append
с картой (int, sys.stdin). Я предполагаю, что это даст значительное ускорение.
- Заменить
map
и l.sort
с imap
и sorted
. Я предполагаю, что это не повлияет на производительность, может быть небольшое замедление, но это будет далеко не значительным. Между ними я обычно бывал с первым, но с Python 3 на горизонте последний, вероятно, предпочтительнее.
- Заменить петлю цикла, используя
print
с print '\n'.join(...)
. Я предполагаю, что это будет еще одно ускорение, но это будет стоить вам некоторой памяти.
- Добавьте cStringIO (что совершенно необязательно, кстати), чтобы увидеть, как это влияет на производительность. Я предполагаю, что он будет немного медленнее, но недостаточно, чтобы счетчик 4 и 2.
Затем, если вы попробуете ответ THC4k, это, вероятно, будет быстрее, чем все вышеперечисленное, будучи проще и проще читать и использовать меньше памяти, чем 4 и 5. Он имеет несколько другое поведение (он не разделяет ведущие нули от чисел).
Конечно, попробуйте сами, вместо того, чтобы доверять кому-либо догадываться. Также запустите cProfile
на свой код и посмотрите, какие части теряют больше всего времени.
Ваша вторая реализация не работает (sys.stdin не подлежит вызову), и он не делает то же самое, что и первый (второй убирает новые строки, а первый - нет). –
Эти две реализации сильно различаются. Было бы очень много работы, чтобы действительно сравнить их на самом низком уровне, требуемом – Falmarri
@Rosh: преобразование строки в int в imap разделит '\ n' в первой реализации – Akhil