Closed wildekat closed 3 months ago
Предлагаю упростить цикл for ntry in range(numtries)
:
def chunked_list(l, size):
for i in range(0, len(l), size):
yield l[i:i+size]
for ntry, chunk in enumerate(chunked_list(relays, NUM_RELAYS)):
relaynum = len(chunk)
test_relays = [TorRelay(r) for r in chunk]
...
Массив аккуратно делится на кусочки, хвосты размером меньше NUM_RELAYS
учитываются автоматически, relaypos
исчезает сам собой и ошибиться тут просто негде. И можно будет удалить за ненадобностью некоторые другие части цикла, например:
if not test_relays:
break
Форкните плиз, если не затруднит, интересно посмотреть в работе. ` working_relays = list() ntry = 0 relaypos = 0 numtries = round(len(relays) / NUM_RELAYS)
def chunked_list(l, size):
for i in range(0, len(l), size):
yield l[i:i+size]
for ntry, chunk in enumerate(chunked_list(relays, NUM_RELAYS)):
relaynum = len(chunk)
test_relays = [TorRelay(r) for r in chunk]
relaypos += NUM_RELAYS
print(
f"\nTry {ntry}/{numtries}, We'll test the following {NUM_RELAYS} random relays:", file=sys.stderr)
for relay in test_relays:
print(relay, file=sys.stderr)
print("", file=sys.stderr)
`
Не уверен что правильно.
Исправил всё перечисленное в первом посте, немного потестировал - работает как надо. Пробуйте
Собрал torparse.pyz с доработкой wildekat, работает норм, хорошая оптимизация.
Merged
Пожалуйста, посмотрите на этот фрагмент. Здесь не надо вычитать 1:
В следующей строке
relaynum
используется так:И
range
послушно выдаёт ровноrelaynum
значений — отrelaypos
доrelaypos+relaynum-1
включительно. Например, приrelaypos = 8
иlen = 9
получаем неправильныйrelaynum = 0
и по определению пустойrange(8, 8)
. Таким образом, последний элемент массиваrelays
теряется.Мне кажется, в этой строчке логичнее использовать
relaynum
вместоNUM_RELAYS
:И
{ntry+1}/{numtries}
, а то оно начинает с "Try 0/2" и заканчивает "Try 1/2". Инициализацияntry = 0
перед циклом не нужна, её можно удалить.Ещё важный момент. Вот это часто даёт неправильный результат:
Например,
round(10/4) == 2
. Протестирует 4*2 == 8 элементов, а про два последних забудет. Тут можно использоватьmath.ceil
, но лучше — один из более надёжных приёмов.А вот здесь квадратные скобки можно удалить за ненадобностью:
Опечатка: constrains -> constraints
Извините, что так много всего. Надеюсь на понимание. Большое спасибо за программу.