Если это pandas DataFrame
, с которым вы работаете, почему бы не отфильтровать значения и не суммировать их все сразу?
Может сработать что-то вроде этого:
trip_counts['AM'] = len(trip[trip.loc[:, 'hour'] < 12].index)
trip_counts['PM'] = len(trip[trip.loc[:, 'hour'] >= 12].index)
РЕДАКТИРОВАТЬ : Я только что провел несколько тестов на приведенных здесь ответах, учитывая, что некоторые люди думают, что понимание списков автоматически выполняется быстрее.
Как видите, обычный for- l oop более или менее имеет лучшую производительность в этом случае, сопоставимую только с использованием Counter
с пониманием списка, как указано в одном из других ответов здесь.
Обратите внимание, что я немного изменил свою реализацию Pandas, чтобы она соответствовала тому, как, по моему мнению, ваши данные могут быть структурированы (т. Е. Не в DataFrame), и поэтому может потребоваться немного больше накладных расходов на преобразование ваших данных в DataFrame при каждом запуске.
Код для создания этого графика показан ниже:
import pandas as pd
import numpy as np
from collections import Counter
from types import SimpleNamespace
import perfplot
def gen_data(n):
onebike_datetimes = [
{'start': SimpleNamespace(hour=9)},
{'start': SimpleNamespace(hour=3)},
{'start': SimpleNamespace(hour=14)},
{'start': SimpleNamespace(hour=19)},
{'start': SimpleNamespace(hour=7)},
{'start': SimpleNamespace(hour=14)},
{'start': SimpleNamespace(hour=19)},
{'start': SimpleNamespace(hour=2)},
{'start': SimpleNamespace(hour=20)},
{'start': SimpleNamespace(hour=12)},
]*n
return onebike_datetimes
def use_vanilla_for(a):
# onebike_datetimes = gen_data(n)
onebike_datetimes = a
trip_counts = {'AM': 0, 'PM': 0}
for trip in onebike_datetimes:
if trip['start'].hour < 12:
trip_counts["AM"] += 1
else:
trip_counts["PM"] += 1
return 1
# return trip_counts
def use_list_comp(a):
# onebike_datetimes = gen_data(n)
onebike_datetimes = a
trip_counts = {'AM': 0, 'PM': 0}
l = ["AM" if trip["start"].hour < 12 else "PM" for trip in onebike_datetimes]
trip_counts = {i: l.count(i) for i in l}
return 1
# return trip_counts
def use_counter(a):
# onebike_datetimes = gen_data(n)
onebike_datetimes = a
trip_counts = {'AM': 0, 'PM': 0}
trip_counts = Counter(("AM" if trip['start'].hour < 12 else "PM")
for trip in onebike_datetimes)
return 1
# return trip_counts
def use_pandas(a):
# onebike_datetimes = gen_data(n)
onebike_datetimes = a
trip = pd.DataFrame(list(map(lambda a: a['start'].hour, onebike_datetimes)), columns=['hrs'])
trip_counts = {'AM': 0, 'PM': 0}
trip_counts['AM'] = len(trip[trip['hrs'] < 12].index)
trip_counts['PM'] = len(trip[trip['hrs'] >= 12].index)
return 1
# return trip_counts
perfplot.show(
setup=lambda n: gen_data(n),
kernels=[
lambda a: use_vanilla_for(a),
lambda a: use_list_comp(a),
lambda a: use_counter(a),
lambda a: use_pandas(a),
],
labels=["vanilla_for", "list_comp", "counter", "dataframe"],
n_range=[2 ** k for k in range(10)],
xlabel="len(a)",
)