2012-02-08 2 views
0

나는 500 번 실행해야하는 상당히 큰 루프가 있으며, 프로그래밍 언어를 사용하고 이러한 유형의 시뮬레이션을하는 것이 처음이다.파이썬 루프의 결과를 추적하는 가장 좋은 방법

하지만 각 결과를 문서화해야하며 목록 (table1)에 모두 0, 모두 1 또는 두 가지가 혼합되어 있으면됩니다.

500 시뮬레이션의 비율을 알아내는 데 가장 빠른 방법이 궁금해서 모든 0, 1 또는 혼합을 포함하는 목록이 만들어졌고 추가로 너무 느려지는 경우가있었습니다. 추가 할 경우, while 루프 전에이 개 부울 바르 (Has1s 및 Has0s)를 만드는 선택을위한

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 :'if "1" "0"은 유효하지만 매우 이상하고 가장 의도하지 않은 Python 코드입니다. 확인해야 할 코드는 무엇입니까? 3. 당신은 append() 메소드를 호출하지 않고있다. 이렇게하면 목록에 추가 할 내용을 말할 수 없습니다. 4.'files1 []'등은 유효한 Python이 아닙니다. –

+1

두 개의 루프 중간에 두 가지를 가져오고 있습니까? – Ben

답변

0

각 False로 초기화. 1 & Has0s를 얻을 때마다 Has1s를 True로 설정합니다. 그러면 0에서 3 개의 검색을 피할 수 있습니다.

+0

나는 그것이 더 빠를 것이라고 의심한다. 최적화 된 C 코드에서 세 가지 "초고속"검색을 피하기 위해 많은 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

files1 또는 files01 또는 files0 always = 0 잘못된 들여 쓰기로 입력해야합니다. – kbob

0

사물을 여러 번 스캔 할 때 손실되는 속도와 비교하여 append()까지 속도가 손실되지 않습니다. 그리고 계산과 비교할 때 메모리 조작에 손실되는 시간은 거의 없습니다. 그러니 걱정하지 마세요. 나는 당신이 어쨌든 축적하고 싶은 목록의 길이에서 그들을 얻을 수 있다면, 카운트를 유지하지 않을 수도 있습니다. 모든 것을 한 번 수행하는 것이 더 읽기 쉽습니다. 물건을 만들고, 세어 본다.

알고리즘의 속도에 관한 결정을 내릴 때 표준 컨테이너를 신뢰합니다. 그래서 행을 Set으로 캐스팅하고 Set ([0]), Set ([1]) 및 Set ([0,1])과 비교합니다. Set()이 한 번 통과하는 반면 'in'은 행의 이중 스캔을 수행한다고 가정합니다.

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와 비교하는 것은 비 - 파이 톤입니다. 상수에 평등을 검사하는 것은 진정한 의미의 Python에서 원하는 것을 얻을 수있는 가장 신뢰할만한 방법입니다. 객체의 존재 또는 목록의 비어 있지 않음으로 표현되는 진술의 진실에 의존하는 많은 Python 관용구가 있습니다. 따라서 부울 결정을 나타 내기 위해 도우미 함수에서 True 또는 False 이외의 값을 반환하는 프로그래머가 직면하게됩니다. 그것에 익숙하지 않게 익숙해 지십시오. 당신이 결코이 그것을해야 비 애널리스트 그래서 비 관용적 인 <을 의미하는 것처럼 다른 비교 연산자 체인과 혼합에 보인다 고통으로 또한

, .

관련 문제