Я пытаюсь решить эту проблему от судьи Timus Online. Чтобы решить эту проблему, вам нужно создать последовательность из 1 000 000 строчных латинских букв и записать ее в stdin за 1 секунду.
Легко решить эту проблему с помощью С++ или Java. У меня есть решение python:
import os
from random import randint
s = ''.join(chr(97 + randint(0, 25)) for i in range(1000000))
os.write(1, bytes(s, 'utf8'))
Требуется 1.7s:
$ time python3.3 1219.py > /dev/null
real 0m1.756s
user 0m1.744s
sys 0m0.008s
И я получил "превышение лимита времени". Итак, вопрос: "Как это сделать быстрее?"
UPD1:
Использование randint(97, 122)
сокращает время на 16 мс. Теперь это 1.740s
UPD2: Решение от @Martijn Pieters занимает 0.979s, но оно также не проходит тест.
UPD3 Martijn Pieters предложил очень хорошие решения, но он все еще медленный:
from sys import stdin
from random import choice
from string import ascii_lowercase
s = ''.join([choice(ascii_lowercase) for _ in range(1000000)])
stdout.write(s)
Принимает 0,924 с
from sys import stdout
from random import choice
from string import ascii_lowercase
for _ in range(1000000):
stdout.write(choice(ascii_lowercase))
принимает 1.173s
from sys import stdout
from random import choice
from string import ascii_lowercase
bal = [c.encode('ascii') for c in ascii_lowercase]
out = stdout.buffer
for _ in range(1000000):
out.write(choice(bal))
Делает 1.155s
from sys import stdout
from random import choice
from string import ascii_lowercase
bal = [c.encode('ascii') for c in ascii_lowercase]
stdout.buffer.write(b''.join([choice(bal) for _ in range(1000000)]))
Делает 0.901s
UPD4
Какой-то парень только что решил проблему на Timus. Надеюсь, он поделится своим решением:)
UPD5 Благодаря Ashwini Chaudhary для обмена своим Python 2.x с нами:
from random import choice
from string import ascii_lowercase
lis=list(ascii_lowercase)
print ''.join(choice(lis) for _ in xrange(1000000))
Он принимает 0.527s на моем компьютере, и он проходит тесты на Timus. Но проблема с Python3.x по-прежнему остается.
UPD6 Благодаря Markku K. этот код:
import os
from random import random
from string import ascii_lowercase
bal = [c.encode('ascii') for c in ascii_lowercase]
os.write(1, b''.join([bal[int(random() * 26)] for _ in range(1000000)]))
Принимает 0,445s, но не прошел тест