我写了一段代码来模拟Matrix中的二进制数流。它运行得非常好,每当我运行此代码时,人们都会问我是否在黑客攻击。在MacOS 10.12.3上运行。
#!/usr/local/bin/python3.6
import random
import time
while True:
for j in range(204): #my full screen terminal is 204 characters wide
print(random.randint(0,1),end='')
time.sleep(0.0001)
print('')
然而,这段代码的效率非常低,耗费了大量电池。那么无论如何都要使这段代码更节能吗?此外,我不希望我的硬盘驱动器有大量的I / O.
答案 0 :(得分:3)
有几种方法可以改善它。一种方法是以编程方式获取终端宽度:
import shutil
terminal_width = shutil.get_terminal_size().columns
另一种方法是一次性生成随机数字。以下是两种不同方法的比较:
In [52]: %timeit ''.join([str(random.randint(0, 1)) for i in range(terminal_width)])
1000 loops, best of 3: 380 µs per loop
In [53]: N = 2**terminal_width - 1
In [54]: %timeit bin(random.randint(0, N))[2:].zfill(terminal_width)
100000 loops, best of 3: 3.05 µs per loop
结合这两者,你得到:
import time
import shutil
import random
terminal_width = shutil.get_terminal_size().columns
N = 2**terminal_width - 1
while True:
digits = bin(random.randint(0, N))[2:].zfill(terminal_width)
print(digits)
time.sleep(1/60)
请注意,终端滚动可能是您脚本中的限制因素,因此您可能需要考虑使用curses
界面并将其全部绘制到位。这里是curses模块原始效果的an example project。
答案 1 :(得分:2)
考虑一下你的帧速率,并且正如@sascha所说,生成整行。
此外,您可能只需生成500个随机行并重复它们,从而节省了大量random
的调用。
所以:
创建一个包含500个随机字符串的数组,但多个字符宽。
编写循环以打印整个字符串。
将您的睡眠时间更改为更逼真的内容。大多数视频游戏的目标是60fps,并且不用担心降到30fps。对于像这样的东西,你可能会得到类似16-20fps的东西。那么,这几秒钟的速度有多快?
您现有的延迟时间为0.0001秒,乘以204个字符,每行为0.0204秒。这大概是每秒50行。减慢到每秒30行,你可能不会注意到很多不同,但你会睡得更久。