4

我正在编写一些 python 代码,在不同的点将大文件拼接在一起。我在 C 中做了类似的事情,我分配了一个 1MB 字符数组并将其用作读/写缓冲区。这非常简单:将 1MB 读入 char 数组,然后将其写出。

但是对于 python,我假设它是不同的,每次我调用 size = 1M 的 read() 时,它都会分配一个 1M 长的字符串。希望当缓冲区超出范围时,我们会在下一次 gc 传递中释放它。

python会以这种方式处理分配吗?如果是这样,恒定分配/释放周期的计算成本是否很高?

我可以告诉 python 使用与 C 相同的内存块吗?还是 python vm 足够聪明,可以自己做?

我想我本质上的目标有点像 dd 在python中的实现。

4

1 回答 1

10

搜索站点 docs.python.orgreadinto以查找适合您正在使用的 Python 版本的文档。 readinto是一个低级特征。它们看起来很像这样:

readinto(b) 将最多 len(b) 个字节读入 bytearray b 并返回读取的字节数。

像 read() 一样,可以向底层原始流发出多次读取,除非后者是交互式的。

如果底层原始流处于非阻塞模式,并且目前没有可用数据,则会引发 BlockingIOError。

但不要过早地担心它。Python 以惊人的速度分配和释放动态内存,并且重复获取和释放微不足道的兆字节的成本很可能会在噪音中消失。请注意,CPython 主要是引用计数的,因此当超出范围时,您的缓冲区将“立即”回收。至于 Python 是否每次都会重用相同的内存空间,可能性是不错的,但不确定。Python 没有尝试强制执行此操作,但取决于整个分配/解除分配模式和系统 Cmalloc()/free()实现的细节,它并非不可能被重用;-)

于 2013-09-16T00:43:17.223 回答