Написание функции генератора доходности на основе заданной задачи - PullRequest
0 голосов
/ 17 декабря 2018

Это часть кода, который должен запускать поиск записей по частям из 1000 записей:

  for subrange, batch in batched(records, size=1000):
      print("Processing records %d-%d" %
        (subrange[0], subrange[-1]))
      process(batch)

Мне нужно написать функцию генератора yield для него, покапопробовал так:

def batched(records, chunk_size=1000):
    """Lazy function (generator) to read records piece by piece.
    Default chunk size: 1k."""
    while True:
        data = records.read(chunk_size)
        if not data:
            break
        yield data

Суть проблемы заключается в следующем:

For optimal performance, records should be processed in batches.
Create a generator function "batched" that will yield batches of 1000
records at a time 

Я тоже не совсем уверен, как проверить функцию, так что, есть идеи?

PS = Функция генератора batched должна предшествовать заданной для цикла subrange.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Ваш заданный код цикла

for subrange, batch in batched(records, size=1000):
    print("Processing records %d-%d" %
      (subrange[0], subrange[-1]))
    process(batch)

имеет неявные требования для batched():

  1. . Он должен возвращать итерацию.Это действительно выполняется функцией генератора.
  2. Полученные предметы должны быть кортежами subrange, batch.Поддиапазон, по-видимому, представляет собой список индексов всех элементов, список или кортеж только начального и конечного индексов или, возможно, объект range().Я предполагаю последнее.

Увы, мы ничего не знаем о данном объекте records.Если он имеет функцию read(), ваш подход можно просто изменить:

def batched(records, size=1000):
    """Generator function to read records piece by piece.
    Default chunk size: 1k."""
    index = 0
    while True:
        data = records.read(size)
        if not data:
            break
        yield range(index, index + len(data)), data
        index += len(data)

Но если records - это просто список, который нужно разбить, вы можете просто сделать

def batched(records, size=1000):
    """Generator function to read records piece by piece.
    Default chunk size: 1k."""
    index = 0
    while True:
        data = records[index:index + size]
        if not data:
            break
        yield range(index, index + len(data)), data
        index += len(data)
0 голосов
/ 17 декабря 2018
def batched(records, chunk_size=1000):
    """Lazy function (generator) to read records piece by piece.
    Default chunk size: 1k."""
    pos = 0
    while True:
        data = records.read(chunk_size)
        if not data:
            break
        yield ([pos, pos + len(data)], data )
        pos += len(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...