который более эффективен для работы с буфером: строки Python или array () - PullRequest
3 голосов
/ 04 февраля 2010

Я создаю процедуру, которая обрабатывает дисковые буферы для криминалистических целей. Мне лучше использовать строки Python или тип array ()? Моей первой мыслью было использовать строки, но я пытаюсь избежать проблем с юникодом, поэтому, возможно, массив ('c') лучше?

Ответы [ 2 ]

9 голосов
/ 04 февраля 2010

Напишите код, используя наиболее естественные (строки), выясните, не слишком ли это медленно, а затем улучшите его.

Массивы можно использовать как замену для str в большинстве случаев, если вы ограничиваете доступ к индексам и срезам. Оба имеют фиксированную длину. Оба должны иметь примерно одинаковые требования к памяти. Массивы являются изменяемыми, если вам нужно изменить буферы. Массивы могут читать непосредственно из файлов, так что при чтении не снижается скорость.

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

Я предполагаю, что упомянутые вами "дисковые буферы" могут быть довольно большими, поэтому вы можете подумать об использовании mmap:

Отображаемые в память файловые объекты ведут себя как строки и как файловые объекты. Однако, в отличие от обычных строковых объектов, они изменчивы. Вы можете использовать объекты mmap в большинстве мест, где ожидаются строки; например, вы можете использовать модуль re для поиска файла с отображением в памяти. Поскольку они изменчивы, вы можете изменить один символ, выполнив obj [index] = 'a', или изменить подстроку, присвоив фрагменту: obj [i1: i2] = '...'. Вы также можете читать и записывать данные, начиная с текущей позиции файла, и искать () по файлу в разных позициях.

6 голосов
/ 04 февраля 2010

Если вам нужно изменить буфер на месте (если вы не уверены, так как вы используете неоднозначный термин "для обработки"), array s, вероятно, будет лучше, так как str звоны неизменны. В Python 2.6 или выше, однако, bytearray s может быть лучшим из обоих миров - изменяемые и богатые методы и также могут использоваться с регулярными выражениями.

Для операций только для чтения строки имеют преимущество над array (благодаря множеству других методов, плюс дополнительные, такие как регулярные выражения, доступные для них), если вы застряли в старых версиях Python и поэтому не можете использовать 1013 *. Unicode не является проблемой в любом случае (в Python 2; в Python 3 определенно идет для bytearray! -).

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