генератор разности производительности и цикл - PullRequest
0 голосов
/ 29 февраля 2020

Я работал с генераторами совсем недавно, и у меня возник вопрос по поводу производительности генераторов и циклов. Из моих исследований и того, что я понимаю о генераторах, они подходят, когда вы не хотите хранить весь «список», который вы перебираете в памяти, а затем 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, являющихся частью функции генератора

...