我正在尝试通过 Timus Online Judge 解决这个问题。要解决这个问题,您需要生成一个由 1 000 000 个小写拉丁字母组成的序列,并在 1 秒内将其写入标准输入。
用 C++ 或 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.7 秒:
$ time python3.3 1219.py > /dev/null
real 0m1.756s
user 0m1.744s
sys 0m0.008s
结果是“超出时间限制”。所以问题是“如何更快地做到这一点?”
UPD1:使用randint(97, 122)
减少了 16ms 的时间。现在是 1.740s
UPD2: @Martijn Pieters 的解决方案需要 0.979 秒,但它也没有通过测试。
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.924s
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.155 秒
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.901 秒
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.527 秒,它通过了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,但仍未通过测试