如何将随机算法更有效率

2024-04-25 04:05:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一段代码来模拟二进制数在矩阵中的流动。它工作得非常好,每当我运行这个代码时,人们都会问我是否正在破解某些东西。在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到我的硬盘驱动器。你知道吗


Tags: 代码inimporttrueforbintimeusr
2条回答

想想你的帧速率,就像@sascha说的,生成你的整行。你知道吗

另外,您可能只需要生成500个随机行并重复它们,就可以节省对random的大量调用。你知道吗

所以:

  1. 创建一个由500个随机字符串组成的数组,但是有很多字符宽。

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

  3. 把你的睡眠时间改成更现实的时间。大多数视频游戏的目标是60fps,不要担心会降到30fps。对于这样的东西,你可能会逃脱像16-20帧。那么,以秒计有多快?你知道吗

    您现有的延迟时间为0.0001秒,乘以204个字符,每行为0.0204秒。大概是每秒50行。放慢速度到每秒30行,你可能不会注意到太大的差别,但你会睡得更长。

有几种方法可以改进它。一种方法是通过编程获得端子宽度:

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接口并将其全部绘制到位。下面是诅咒模块的原始效果的an example project。你知道吗

相关问题 更多 >