2017-04-17 69 views
0

我寫了一段代碼來模擬矩陣中的二進制數字流。它工作得很好,每當我運行這個代碼的時候,人們會問我是否在攻擊某些東西。在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到我的硬盤。

+0

生成一個完整的行,然後打印這整行。你也會很驚訝,如何依賴這是你的終端。 (例如,Eclipse IDE內的終端可能比MS cmd快100倍)。 – sascha

+0

@sascha我認爲這實際上就是我所做的(我不知道能效問題),因爲當我嘗試打印某些內容時,如果沒有找到「換行符」,它將不會被打印出來。所有的數字實際上都是逐行打印。也許它與python的'stdout'緩衝區有關,但我不確定。 – pkqxdd

+1

我沒有看到結尾=''+ python3,但我很確定,構建一個大字符串和打印一次會更有效。 – sascha

回答

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模塊的原始效果的an example project

+0

哇,非常感謝。我不知道'curses'和'shutil'模塊的存在。也許我應該花更多的時間閱讀1897頁的文檔:) – pkqxdd

+0

說實話,雖然我在盯着屏幕5分鐘後頭痛了。 – pkqxdd

2

想想你的幀速率,如@sascha所說,生成你的線條整個。

此外,您可能只需生成500條隨機線並重復它們,從而將一堆電話保存到random

所以:

  1. 創建的500個隨機字符串數組,然而,很多字符寬。

  2. 編寫你的循環來打印整個字符串。

  3. 將您的睡眠時間改爲更真實的東西。大多數視頻遊戲的目標是60fps,不用擔心會下降到30fps。對於這樣的事情,你可能會拿走16-20fps之類的東西。那麼,幾秒鐘內有多快?

    您現有的延遲時間爲0.0001秒,乘以204個字符,每行0.0204秒。這大概是每秒50行。慢下來,每秒30行,你可能不會注意到很多差異,但你會睡得更久。