[英]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
的調用。
所以:
創建一個由500個隨機字符串組成的數組,但是寬度為多個字符。
編寫循環以僅打印整個字符串。
將睡眠時間更改為更現實的時間。 大多數視頻游戲的目標是60fps,而不必擔心降至30fps。 對於這樣的事情,您可能可以擺脫16-20fps的麻煩。 那么,以秒為單位的速度有多快?
您現有的0.0001秒的延遲時間乘以204個字符,得出的結果是每行0.0204秒。 大概是每秒50行。 放慢到每秒30行,您可能不會注意到太大的差異,但是您會睡得更長的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.