Форум сайта python.su
-2
Есть одна функция, суть такова: переворачивать байты в дверде, т.е. “12345678” должно стать “43218765”. То, что я написал, по сравнению со скоростью чтения диска безбожно тормозит. Ваши предложения?
def reverseDwords(data): assert len(data) % 4 == 0, "Data length must be multiple of 4 but is %s" % len(data) l = [] i = iter(data) for x in range(len(data) // 4): l1 = [i.next(), i.next(), i.next(), i.next()] l1.reverse() l += l1 return "".join(l)
Отредактировано asilyator (Май 28, 2012 22:12:40)
Офлайн
52
def foo(s): # assert ... result = '' for step in xrange(len(s)/4): result = ''.join((result, s[4*step:4*(step+1)][::-1])) return result
З.Ы. Ой как хорошо у вас 1 и l сливаются.Почитайте Макконнелла.
Отредактировано fata1ex (Май 28, 2012 22:42:40)
Офлайн
173
По-моему, вы делаете что-то не так. Если это бинарные данные, то читать их лучше сразу в unsigned int с соответствующим порядком байт (Little или Big endian) с помощью модуля struct.
Но если все-таки нужна функция, можно и со struct сделать:
def reverse_with_struct(data): assert len(data) % 4 == 0, "Data length must be multiple of 4 but is %s" % len(data) ndwords = len(data)//4 return struct.pack(">%dI" % ndwords, *struct.unpack("<%dI" % ndwords, data))
Отредактировано reclosedev (Май 28, 2012 22:51:56)
Офлайн
-2
Питонотсос. Расшифровать нативным модулем быстрее, чем перевернуть дверды.
Мой вариант:
def reverse(data): assert len(data) % 4 == 0, "Data length must be multiple of 4 but is %s" % len(data) b = bytearray(data) for x in xrange(0, len(data), 4): b[0+x], b[1+x], b[2+x], b[3+x] = b[3+x], b[2+x], b[1+x], b[0+x] return b
reverse(decrypt(reverse))
Отредактировано asilyator (Май 28, 2012 23:01:28)
Офлайн
52
Хм. Результаты по времени с последним вариантом идентичные. Интересно было бы посмотреть на ассемблерный код.
Питонотсос.Как ни банально, но для каждой задачи - свой инструмент. Нужна скорость обработки простых данных, выбирайте Си, а не питон. Ну а если всё-таки питон, то вставить в код сишную функцию довольно просто.
Отредактировано fata1ex (Май 28, 2012 23:03:24)
Офлайн
-2
Меня все устраивает, кроме этого самого места. Что прикажете делать? Писать расширение на си или из-за одного места менять язык?
Офлайн
52
Однозначно делать вставку на Си.
Офлайн
-2
И как это потом распространять прикажете?
Офлайн
173
asilyatorА что происходит в decrypt? Есть возможность скинуть код?
reverse(decrypt(reverse))
Офлайн
52
Через build-скрипт setup.py как обычно. clck
Офлайн