Поскольку вы связаны с документами 2.7, я предполагаю, что вы используете 2.7. (В Python 3.x, это все становится намного проще, потому что намного больше буферизации подвергаются на уровне Python.)
Всех open
фактически делает (в системах POSIX) является вызовом fopen
, а затем, если вы передали что-либо за buffering
, setvbuf
. Поскольку вы ничего не пропускаете, вы просто получаете буфер по умолчанию от fopen
, который соответствует вашей стандартной библиотеке C. (. См. the source для деталей При отсутствии buffering
, она проходит -1 до PyFile_SetBufSize
, который ничего не делает, если bufsize >= 0
)
Если вы читали glibc setvbuf
manpage, он объясняет, что если вы никогда не вызвать любого из функций буферных:
Обычно все файлы блокируются блоком. Когда первая операция ввода-вывода происходит в файле, вызывается malloc
(3) и получается буфер.
Обратите внимание, что он не говорит, какой размер буфера получен. Это намеренно; это означает, что реализация может быть умной и выбирать разные размеры буфера для разных случаев. (Существует постоянная BUFSIZ
, но используется только при вызове устаревших функций, таких как setbuf
;. Это не гарантировано быть использован в любом другом случае)
Итак, что это происходит? Ну, если вы посмотрите на источник glibc, в конечном счете он вызывает макрос _IO_DOALLOCATE
, который можно подключить (или переопределить, поскольку glibc унифицирует буферизацию C++ streambuf и C stdio), но в конечном итоге он выделяет buf _IO_BUFSIZE
, который является псевдонимом для специфичного для платформы макроса _G_BUFSIZE
, который является 8192
.
Конечно, вы, вероятно, захотите проследить макросы в своей собственной системе, а не доверять родовому источнику.
Вы можете задаться вопросом, почему нет хорошего документального способа получения этой информации. По-видимому, это потому, что вы не должны заботиться. Если вам нужен определенный размер буфера, вы устанавливаете его вручную; если вы верите, что система знает лучше, просто доверяйте ей. Если вы на самом деле не работаете над ядром или libc, кого это волнует? Теоретически это также оставляет открытой возможность того, что система может сделать что-то умное здесь, например, выбор bufsize на основе размера блока файловой системы файла или даже на основе данных о текущих файлах, хотя это не похоже на linux/glibc , FreeBSD или OS X - ничего, кроме использования константы. И, скорее всего, это потому, что это действительно не важно для большинства приложений. (Возможно, вы захотите проверить это самостоятельно - используйте явные размеры буферов от 1 КБ до 2 МБ на каком-то сценарии с буферизованным вводом-выводом и посмотрите, каковы различия в производительности.)
Отличное объяснение abarnert! Благодарю. – falconepl