Я работал с генераторами совсем недавно, и у меня возник вопрос по поводу производительности генераторов и циклов. Из моих исследований и того, что я понимаю о генераторах, они подходят, когда вы не хотите хранить весь «список», который вы перебираете в памяти, а затем l oop поверх него. Вместо этого генераторы возвращают элемент в каждом списке во время вызова и отслеживают, где можно забрать при следующем вызове. Я правильно понял?
Хотя это выглядит очень похоже на a для l oop, я не уверен в разнице в производительности, игнорирующей преимущества экономии памяти.
Например, сценарий, в котором:
CASE A:
def my_generator():
for api_resp in paginator.make_api_call()
# where api_resp has the format: {"Contents": [{"Key": "value1", "last_mod_dt": datetime}, {"Key": "value2", "last_mod_dt": datetime}]} and can have thousands/millions of entries in the list.
for item in api_resp["Contents"]:
yield item["Key"]
my_dict = defaultdict(list)
for item in my_generator():
item["sub_string_of_item"].append("item")
CASE B:
def my_generator():
for api_resp in paginator.make_api_call()
# where api_resp has the format: {"Contents": [{"Key": "value1", "last_mod_dt": datetime}, {"Key": "value2", "last_mod_dt": datetime}]} and can have thousands/millions of entries in the list.
yield api_resp["Contents"]
my_dict = defaultdict(list)
for item in my_generator():
for obj in item:
item[parse_substring_of(obj["Key"]].append(obj["Key"])
Какой из них более производительный? Меняется ли это с увеличением количества предметов? Я могу сделать это любым способом, я просто пытаюсь понять наиболее эффективный способ использования генератора.
Спасибо за любую помощь! Любые ссылки на соответствующие статьи приветствуются для дальнейшего изучения!
РЕДАКТИРОВАТЬ: добавлено для уточнения нескольких вызовов API, являющихся частью функции генератора