Лучший способ отслеживать результаты из цикла Python

У меня довольно большой цикл, который нужно запускать 500 раз, и я новичок в использовании языка программирования и в этом типе моделирования.

Но мне нужно задокументировать результаты каждого прогона, и если список (таблица1) содержит либо все 0, либо все 1, либо их сочетание.

Мне просто интересно, какой метод будет самым быстрым, чтобы выяснить, какая доля 500 симуляций привела к списку, содержащему все 0, все 1 или микс, и если append замедлит его слишком много.

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 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

Ответ 1

Чтобы выбрать, где добавить, создайте 2 булевых вара (Has1s и Has0s) перед циклом while, каждый из которых инициализируется False. Установите Has1s в True, когда вы получаете 1 и Has0s, когда получаете 0, - тогда вы избегаете (до) 3 запросов в конце.

Ответ 2

Что именно вам нужно в конце?

Если вы просто хотите знать долю всех 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
...

тогда вам не нужно делать len(files01) в конце, чтобы узнать, сколько из них было смешано с 1 и 0.

Ответ 3

Нет скорости, потерянной до 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, из вспомогательных функций для представления булевых определений. Привыкайте к тому, чтобы не быть в курсе.

Также, как ни странно, в, когда он смешивается с другими операторами сравнения, как будто это означает <, что для неаналитиков настолько неидиоматично, что вы никогда не должны этого делать.