2017-04-17 6 views
0

行列に2進数の流れをシミュレートするコードを書きました。それは完璧に動作し、私は何かをハッキングしている場合、このコードを実行するたびに人々は尋ねる。 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

@サシャ私は何かを印刷しようとすると、改行文字を見つけることなく印刷されないので、これは実際に私がしたことだと思います(私は電力効率についてはわかりません)。行ごとに印刷されます。たぶん、それはPythonの 'stdout'バッファと関係がありますが、わかりません。 – pkqxdd

+1

私はそのエンド= '' + python3は見ませんでしたが、1つの大きな文字列を作成して1回プリントを呼び出す方が効率的です。 – sascha

答えて

3

改善する方法はいくつかあります。 1つの方法は、プログラムで端末幅を取得することです。

import shutil 

terminal_width = shutil.get_terminal_size().columns 

もう1つの方法は、一度にランダムな数字を生成することです。ここでは、2つの異なる方法の比較である:

2を組み合わせる
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モジュールのオリジナルエフェクトは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文字を掛けて、1行に0.0204秒を与えます。これはおよそ50行/秒です。 1秒間に30本のラインまでスローダウンしてください。多分違いは気付かないでしょうが、あなたはもっと長く寝るでしょう。

関連する問題