Я все еще думаю, что процедура разбора - это ваше узкое место (даже если оно пришло от Google), но все эти '. Убивали меня! (И они несколько снижают производительность.) Кроме того, я преобразовал ваши итерации i, i + 1 в два итератора, пролистывающих список обновлений, это немного более продвинутый стиль работы со списком. Плюс имена cur/next_update
помогли мне быть честными, когда вы хотели сослаться на одно против другого. Наконец, я удаляю завершающий «else: continue», так как вы в конце все равно для l oop.
for trip in feed.entity:
this_trip_update = trip.trip_update
this_trip_id = this_trip_update.trip.trip_id
if this_trip_id not in read_trips:
try:
if len(this_trip_update.stop_time_update) == len(stopsOnTrip[this_trip_id]):
print("\t", "Adding delays for", len(this_trip_update.stop_time_update), "stops, on trip_id",
this_trip_id)
# create two iterators to walk through the list of updates
cur_updates = iter(this_trip_update.stop_time_update)
nxt_updates = iter(this_trip_update.stop_time_update)
# advance the nxt_updates iter so it is one ahead of cur_updates
next(nxt_updates)
for cur_update, next_update in zip(cur_updates, nxt_updates):
# Store the delay data point (arrival difference of two ascending nodes)
delay = int(nxt_update.arrival.delay - cur_update.arrival.delay)
# Store contextual metadata (timestamp and edgeID) for the unique delay data point
ts = int(next_update.arrival.time)
key = "{}/{}".format(cur_update.stop_id, next_update.stop_id)
# Append data to numpy array
datapoints = np.append(datapoints, np.array([[key, ts, delay]]), axis=0)
read_trips.add(this_trip_id)
except KeyError:
continue
Этот код должен быть эквивалентным тому, что вы опубликовано, и я не ожидаю значительного увеличения производительности, но, возможно, это будет более приемлемым, если вы вернетесь к нему через 6 месяцев.
(вероятно, - это больше подходит для CodeReview, но я вряд ли когда-нибудь go там.)