amarao (amarao_san) wrote,
amarao
amarao_san

всё лучше и лучше

    def __iter__(self):
        return self.yielder()

    def yielder(self):
        for e in self.iterator():
            self.value =  self.add(self.value, e[0], e[1])
            if len(self.value) > 1:
                yield self.value.pop(0)
        yield self.value.pop(0)


Выглядит очень питонистически. Работает почти как часы. Единственная проблема - хвост json'а, когда после него сразу следующий json. При ближайшем расмотрении, дело не в том, как я yield'жу, а в том, что следующее значение полностью затирает предыдущие. То есть мне присылают (), [] - и я радостно херю всё, что было хорошего в self.value до сих пор.

Решение простое, кстати. Даже без хаков в районе self.add, как я думал сначала. Надо просто отлавливать этот момент и возвращать хвост старого значения.

(задумчиво) если я решу когда-то оптимизировать скорость, это отличное место - можно yield'ить за раз больше одного словаря. То есть читаем пачку, потом yield'им.

А вот и цифры:

30000 списков, по три словаря в каждом, по три значения в каждом словаре - 13.2с. То есть 430 µs на словарь, 150 µs на значение. На человеческий счёт - 2600 простых словарей в секунду. Не густо, конечно, но для первого приближения сойдёт.

Собственно, сам код: https://github.com/amarao/json4shell/blob/jsonstream/tools/dictyield.py
Tags: json, json4shell, python, программирование
Subscribe

  • LVM'ная загадочка

    А вот вам загадка: Есть LVM, никаких снапшотов и cow'ов, всё примитивно и просто. В VG состоит из одного диска (sda), порезана на несколько томов. В…

  • linux-акробатика

    Дано: md0 - raid1 из двух 1.5Тб дисков md1 - raid1 из двух 2Тб дисков. На них LVM, на нём xfs. Добавляем два 4Тб диска. Задача: убрать 2 1.5Тб…

  • (no subject)

    Товарищ vitus_wagner задал хороший вопрос: какую latency привносит lvm в блочный стек? Устное "да там всё зашибись" это одно, а вот математика:…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments