【问题标题】:How to make random algorithm more efficient如何让随机算法更高效
【发布时间】:2017-09-12 15:41:18
【问题描述】:

我写了一段代码来模拟矩阵中的二进制数流动。它工作得很好,每当我运行这段代码时,人们都会问我是否在破解某些东西。在 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。

【问题讨论】:

  • 在前面生成一个完整的行,然后打印这个完整的行。您还会对这对您的终端的依赖程度感到惊讶。 (例如,Eclipse IDE 中的终端可能比 MS cmd 快 100 倍)。
  • @sascha 我认为这实际上是我所做的(我不知道电源效率),因为当我尝试打印某些东西时,如果没有找到 new line character. All 就不会打印它这些数字实际上是逐行打印的。可能和python的stdout缓冲区有关,但我不确定。
  • 我没有看到 end='' + python3,但我很确定,构建一个大字符串并调用一次 print 会更有效。

标签: python algorithm python-3.x random


【解决方案1】:

有几种方法可以改进它。一种方法是以编程方式获取终端宽度:

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 使用 curses 模块的原始效果。

【讨论】:

  • 哇,非常感谢。我不知道cursesshutil 模块的存在。也许我应该花更多时间阅读 1897 页的文档 :)
  • 说实话,这东西让我盯着屏幕看了5分钟就头疼。
【解决方案2】:

想想你的帧率,就像@sascha 说的,生成你的整个线条。

此外,您可能只生成 500 条随机行并重复它们,从而节省大量对 random 的调用。

所以:

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

  2. 编写你的循环来打印整个字符串。

  3. 将您的睡眠时间更改为更真实的时间。大多数视频游戏的目标是 60fps,不用担心会掉到 30fps。对于这样的事情,你可能会以 16-20fps 的速度逃脱。那么,以秒为单位的速度有多快?

    您现有的 0.0001 秒延迟时间乘以 204 个字符,得出每行 0.0204 秒。大约是每秒 50 行。将速度减慢到每秒 30 行,您可能不会注意到太大的差异,但您会睡得更久。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多