2012-02-08 15 views
0

私は500回実行する必要があるかなり大きなループがあります。プログラミング言語を使用してこのタイプのシミュレーションを行うのは初めてです。Pythonループの結果を追跡する最良の方法

しかし、各実行の結果と、リスト(table1)にすべての0、すべて1、またはその両方が含まれている場合は、文書化する必要があります。

500のシミュレーションのうち、どの割合が0になっているか、すべて1であるか、ミックスであるかを調べるために、どの方法が最も速いのか不思議に思っていました。

for x in range(0, 500): 

    times = 300 
    gamma_val = 2 

    table1 = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

    total = 0.0 
    while total < times: 
     table = [0 for i in range (21)] 
     for d1 in range(21): 
      if table1[d1]: 
       table[d1] = -(1/gamma_val)*math.log((random.random())) 
      else: 
       table[d1] = -(math.log(random.random())) 
     ####Goes on to make new table1 with changes, either all 1's, all 0's or a mix of 0s #########and 1s 

    files1 = 0 
    files01 = 0 
    files0 = 0 

    if "1" "0" in table1 == True: 
      files01 += 1 
    elif 1 in table == True: 
      files1 += 1 
    elif 0 in table1 == true: 
      files0 += 1 
+0

早すぎる最適化は、(大部分の)悪の根源です – GoingTharn

+3

あなたのコードには適切な答えを与えるのが難しい複数の問題があります。 1.くぼみが壊れている。インデントはPythonのプログラムの意味を変え、適切な字下げがなければ、適切な意味を推論することは不可能です。 2. 'table1 == True:'の "1" "0"が有効であるが、非常に奇妙で最も意図的ではないPythonコードである。チェックするはずのこのコードは何ですか? 3.あなたは 'append()'メソッドを呼び出すのではなく、単にそれらを探しているだけです。このようにして、リストに追加したいものが何であるかを知ることは不可能です。 4. 'files1 []'などは有効なPythonではありません。 –

+1

2つのループの途中で2つのものをインポートしていますか? – Ben

答えて

0

追加する場所を選択するには、それぞれがFalseに初期化されたwhileループの前に2つのブール値(Has1とHas0)を作成します。 1 & Has0sを取得したときは常にHas1sをTrueに設定します。最後に3回までの検索を回避します。

+0

私はそれがより速いとは思わない。最適化されたCコードで3回の「超高速」検索を避けるために、たくさんのPythonコードを実行します。 (コードがないので、コードの時間を計ることはできません...) – WolframH

0

最終的には正確に何が必要ですか?

すべての1、すべての0、またはミックスの割合を知りたい場合は、リストを生成するのではなく、変数値を増やすほうが直感的です(少なくとも私にとって)。あなたのようなコードに何かを設定した場合:

... 
files1=0 
files01=0 
files0=0 

if 1 in table1 and 0 in table1: 
     files01 += 1 
elif 1 in table: 
     files1 += 1 
elif 0 in table1: 
     files0 += 1 
... 

はその後、あなたは1と0のミックスを持っていたどのように多くの知っている最後にlen(files01)を行う必要はありません。

+0

これは素晴らしい方法です。 – kbob

+0

ちょうどそれが正常に動作するように見えることができない – kbob

+0

ファイル1またはfiles01またはfiles0常に= 0私はちょうど間違ったインデントでそれを持っている必要があります – kbob

0

物事を何度もスキャンすると失われるスピードと比べて、append()にスピードが失われることはありません。そして計算に比べてメモリ操作に失われる時間はほとんどありません。だからそれについて心配しないでください。とにかく累積したいリストの長さからそれらを得ることができれば、カウントを保持しないかもしれません。すべてを一度行うのは読みやすくなります。ものを作って、数えてください。

標準的なコンテナは、アルゴリズムの速度に関する意思決定に相対して信頼します。だから私は行をSetにキャストし、Set([0])、Set([1])、Set([0,1])と比較します。私は 'in'が行の二重走査を行い、Set()は一回通過すると仮定します。

BOTH = set([0, 1]) 
results = {'0': [], '1': [], '01': []} 

.... make the list .... 


elements = set(table) 
if elements == BOTH: 
    results['01'].append(table) 
else if 1 in elements: 
    results['1'].append(table) 
else: 
    results['0'].append(table) 

そして私は私のスタイルではなく、あからさまなエラーに関する摘み作るしようとします:

すべての条件を排出していない、他の最終を使用します。それは本当に読みやすいです。別々にそれらをすべて消耗させることは、あなたが想像していたどんなケースが残っているのだろうと思ってしまいます。パラノイアを繁殖させる。

一般に、事実をTrueまたはFalseと比較するのは非パイソンです。定数と等しいかどうかをチェックするTrueは、Pythonの条件から欲しいものを得るための最も信頼性のない方法です。文の真実をオブジェクトの存在、またはリストの空ではないものに頼るPythonの慣用句がたくさんあります。したがって、TrueまたはFalse以外の何かをヘルパー関数から返して、ブール値を表すプログラマに直面します。それに煩わされないように慣れてください。また

、それはそうと痛い、それはあなたががそれを行うことはありませんべきであるが、アナリストのためにそう非慣用的である<を、意味しているかのように他の比較演算子鎖と混合で

関連する問題