簡體   English   中英

如何提高隨機算法的效率

[英]How to make random algorithm more efficient

我寫了一段代碼來模擬矩陣中的二進制數字流。 它工作得非常好,每當我運行此代碼時,人們都會問我是否在破解某些東西。 在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。

有幾種方法可以改進它。 一種方法是以編程方式獲取端子寬度:

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模塊的原始效果的示例項目

考慮一下您的幀速率,然后如@sascha所說,生成整個行。

另外,您可能只生成500條隨機行並重復它們,從而節省了對random的調用。

所以:

  1. 創建一個由500個隨機字符串組成的數組,但是寬度為多個字符。

  2. 編寫循環以僅打印整個字符串。

  3. 將睡眠時間更改為更現實的時間。 大多數視頻游戲的目標是60fps,而不必擔心降至30fps。 對於這樣的事情,您可能可以擺脫16-20fps的麻煩。 那么,以秒為單位的速度有多快?

    您現有的0.0001秒的延遲時間乘以204個字符,得出的結果是每行0.0204秒。 大概是每秒50行。 放慢到每秒30行,您可能不會注意到太大的差異,但是您會睡得更長的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM