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