如何使随机算法更有效率

时间:2017-04-17 02:39:32

标签: python algorithm python-3.x random

我写了一段代码来模拟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.

2 个答案:

答案 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的调用。

所以:

  1. 创建一个包含500个随机字符串的数组,但多个字符宽。

  2. 编写循环以打印整个字符串。

  3. 将您的睡眠时间更改为更逼真的内容。大多数视频游戏的目标是60fps,并且不用担心降到30fps。对于像这样的东西,你可能会得到类似16-20fps的东西。那么,这几秒钟的速度有多快?

    您现有的延迟时间为0.0001秒,乘以204个字符,每行为0.0204秒。这大概是每秒50行。减慢到每秒30行,你可能不会注意到很多不同,但你会睡得更久。