Как использовать генератор пакетирования / пакетирования в Python? - PullRequest
1 голос
/ 02 апреля 2011

Чтобы амортизировать накладные расходы на вызов функции, я изменил свой генератор так, чтобы он выдавал список фиксированной длины из нескольких значений, а не выводил одно значение за раз. Генератор в том виде, в котором он изначально стоял, извлек объект из файла, который содержит несколько объектов, и получил его. Затем они были обработаны внутри цикла for, который потреблял генератор. Этот подход оказался намного медленнее, чем наличие кода для обработки объектов в цикле ручного развертывания, который одновременно выбирал несколько последовательных элементов в файле. Я пытаюсь найти компромисс. Мой модифицированный генератор выдает список маринованных объектов фиксированной длины за раз. Я ищу Pythonic способ распаковать этот пакет неотсортированных объектов на стороне потребителя.

Есть ли способ деконструировать эти пакеты без дополнительного вложенного цикла? Я неправильно предположил, что оператор * сделает это так:

for x in *packetizing_generator(): f(x)

Вложенный цикл, конечно, работает, но мне интересно, есть ли более короткий и элегантный способ.

1 Ответ

1 голос
/ 02 апреля 2011

Я думаю, это то, о чем вы говорите, дайте мне знать, если я не на правильном пути.

for a, b, c in your_generator:
    # do stuff

Предполагается, что your_generator дает результаты в виде последовательности точно из 3 элементов.

Вы можете создать генератор, который будет выдавать ровно n элементов за раз для использования в цикле for, следующим способом:

itertools.izip_longest(*[your_generator]*n)

И если ваш генератор не выдает ни одного предмета за раз, и вы хотите изменить количество производимых им предметов, вы используете следующее:

itertools.izip_longest(*[itertools.chain(*your_generator)]*n)

Вот пример:

>>> from itertools import izip_longest, chain, combinations
>>> for a, b, c, d in izip_longest(*[chain(*combinations(range(4), 2))]*4):
...     print a, b, c, d
... 
0 1 0 2
0 3 1 2
1 3 2 3

Это берет генератор, который первоначально давал предметы по два за раз, и вместо этого дает элементы четыре за один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...