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

  • Rust soundness

    Каждый раз, когда я сталкиваюсь с маленькими "но" в Rust'е, это ощущение тщательной продуманности. Например, простейшие fold-функции для итераторов:…

  • still_ntp

    В ходе локального мозгового штурма у меня родилась суперидея. Надо написать ntp сервер, который может отдавать указанную дату. Т.е. сказали при…

  • arping'а не достаточно

    Я обнаружил, что arping не умеет делать целый запрос полностью (т.е. source mac, dest mac, source ip, dest ip). Dest либо IP, либо mac, и это немного…

  • 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