aba*_*ert 27
由于您链接到2.7文档,我假设您使用的是2.7.(在Python 3.x中,这一切都变得更加简单,因为在Python级别暴露了更多的缓冲.)
所有open实际上(在POSIX系统上)都是调用fopen,然后,如果你已经传递了任何东西buffering,setvbuf.由于你没有传递任何东西,你最终会得到默认的缓冲区fopen,这取决于你的C标准库.(有关详细信息,请参阅源代码.如果没有buffering,则将-1传递给PyFile_SetBufSize,除非执行任何操作bufsize >= 0.)
如果您阅读了glibc setvbuf联机帮助页,它会解释如果您从未调用过任何缓冲函数:
通常所有文件都是块缓冲的.当在文件上发生第一次I/O操作时,
malloc调用(3),并获得缓冲区.
请注意,它没有说明获得了什么大小的缓冲区.这是故意的; 这意味着实现可以是智能的,并为不同的情况选择不同的缓冲区大小.(有一个BUFSIZ常数,但只有当你调用遗留函数时才会使用setbuf它;它不能保证在任何其他情况下使用.)
那么,会发生什么?好吧,如果你看看glibc源代码,最终会调用宏_IO_DOALLOCATE,它可以被挂钩(或被覆盖,因为glibc统一了C++ streambuf和C stdio缓冲),但最终,它分配了一个buf _IO_BUFSIZE,这是一个别名特定于平台的宏_G_BUFSIZE,即8192.
当然,您可能希望在自己的系统上追踪宏而不是信任通用源.
您可能想知道为什么没有良好的文档记录方式来获取此信息.大概是因为你不应该关心.如果您需要特定的缓冲区大小,请手动设置一个; 如果您相信系统最了解,那就相信它吧.除非你真的在内核或libc上工作,否则谁在乎呢?理论上,这也留下了系统在这里可以做一些聪明的事情的可能性,比如根据文件的文件系统的块大小选择bufsize,甚至基于运行的stats数据,尽管它看起来不像linux/glibc ,FreeBSD或OS X做除了使用常量之外的任何事情.而且很可能是因为它对大多数应用程序来说无关紧要.(您可能希望自己测试一下 - 在一些缓冲的I/O绑定脚本上使用范围从1KB到2MB的显式缓冲区大小,并查看性能差异.)
小智 16
我不确定这是正确的答案,但python 3.0库和python 20库的描述io.DEFAULT_BUFFER_SIZE方式与文档中描述的默认值相同open().巧合?
如果没有,那么我的答案是:
$ python
>>> import io
>>> io.DEFAULT_BUFFER_SIZE
8192
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.1 LTS
Release: 14.04
Codename: trusty
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13385 次 |
| 最近记录: |