Эта часть моего кода не масштабируется, если размер увеличивается.Извлечение элементов из списка при его обходе
Я перебираю свои данные и накапливаю их каждые dt Временное окно. Для этого я сравниваю значение нижнего и верхнего значения времени. Когда я достигаю верхней границы, я разбиваю на цикл для эффективности. В следующий раз, когда я запустил для цикла Я хочу начать не с самого начала, а из элемента, который я остановил ранее, для эффективности. Как я могу это сделать?
Я попытался удалить/поп-элементы списка, но индексы перепутались. Я читал, что я не могу изменить список I, но моя цель, похоже, не редкость, поэтому должно быть решение. Меня не волнуют оригинальные данные список позже в моем коде, я хочу только оптимизировать свое накопление.
# Here I generate data for you to show my problem
from random import randint
import numpy as np
dimension = 200
times = [randint(0, 1000) for p in range(0, dimension)]
times.sort()
values = [randint(0, dimension) for p in range(0, dimension)]
data = [(values[k], times[k]) for k in range(dimension)]
dt = 50.0
t = min(times)
pixels = []
timestamps = []
# this is my problem
while (t <= max(times)):
accumulator = np.zeros(dimension)
for idx, content in enumerate(data):
# comparing lower bound of the 'time' window
if content[1] >= t:
# comparing upper bound of the 'time' window
if (content[1] < t + dt):
accumulator[content[0]] += 1
# if I pop the first element from the list after accumulating, indexes are screwed when looping further
# data.pop(0)
else:
# all further entries are bigger because they are sorted
break
pixels.append(accumulator)
timestamps.append(t)
t += dt
Если вы разорвать цикл в свою собственную функцию, вы можете пройти начальный индекс цикла в качестве параметра (используйте [диапазон()] (https://docs.python.org/2/library /functions.html#range) в цикле). Затем, когда вы снова запустите цикл, вы можете вызвать его из индекса, который вы закончили. При первом вызове функция выполняет ноль.Параметр также будет первым параметром, с которым вы вызываете диапазон. –
Если вы хотите удалить элементы, вы можете зайти в обратную сторону или создать копию списка или использовать понимание списка. См. [This] (http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating-in-python) –
спасибо! Мне нужно больше практики python, потому что range() мне не пришло в голову. Я пытался найти аналог итераторов C++. – beginh