2014-08-30 1 views
4

Я смотрю через источник StringIO, где он говорит, говорит, что некоторые примечания:Почему объект StringIO медленнее, чем реальный объект?

  1. Используя настоящий файл часто быстрее (но менее удобно).
  2. Существует также более быстрая реализация в C, называемая cStringIO, но это не подклассы.

StringIO так же, как объект файла памяти, почему это медленнее, чем реальный объект файла?

ответ

1

Управление файлами на Python is implemented entirely in C. Это означает, что он довольно быстр (по крайней мере, в том же порядке, что и собственный C-код).

Библиотека StringIO, однако, написана на Python. Таким образом, сам модуль интерпретируется с соответствующими штрафами за производительность.

Как вы знаете, есть еще один модуль cStringIO с similar interface, который вы можете использовать в коде, чувствительном к производительности. Причина этого не подклассы является , потому что он написан на C.

+0

Спасибо за ваш ответ. – JanuaryStar

0

Это не обязательно очевидно из источника, но объекты файла python строятся прямо на библиотечных функциях C, с вероятным небольшим слоем python, чтобы представить класс python или даже C-оболочку для представления класса python. Собственная библиотека C будет очень оптимизирована для чтения байтов и блоков с диска. Библиотека python StringIO - это собственный код на языке python, который медленнее, чем собственный C-код.

+0

Я считаю, что ОП нашел источник уже ... – XORcist

+0

ok - перечитывая вопрос, это противоречиво.Требуется небольшое редактирование - сделано :-) –

+0

Извините за мой бедный английский, мой смысл - «смотреть», а не «искать». – JanuaryStar

0

Это не на самом деле о истолковано природе Пайтона: BytesIO реализован в Python *, такой же, как StringIO, но все еще бьется файл I/O ,

Фактически, StringIO работает быстрее, чем файл ввода/вывода под StringIO. Идеальный вариант использования (одна запись начинается с пустого буфера). На самом деле, если запись достаточно велика, она даже обыграет cStringIO. См. Мой вопрос here.

Так почему же StringIO считается «медленным»? StringIO Настоящая проблема подкрепляется неизменяемыми последовательностями, str или unicode. Это нормально, если вы только пишете один раз, очевидно. Но, как указал tdelaney's answer на мой вопрос, он замедляет тонну (например, 10-100x) при записи в случайные местоположения, так как каждый раз, когда он получает запись в середине, он должен скопировать всю последовательность поддержки.

BytesIO не имеет этой проблемы, так как он поддерживается (изменчивым) bytearray. Аналогично, независимо от того, что делает cStringIO, он, кажется, обрабатывает случайные записи намного легче. Я предполагаю, что он нарушает правило неизменяемости внутри, так как строки C изменяемы.

* Ну, версия в _pyio есть, во всяком случае. Стандартная версия библиотеки в io написана на C.

Смежные вопросы