Python中有什么高性能的二进制流操作方式?
因为习惯用 Python,日常工作中常常涉及转换二进制文件格式(比如读取 2 个字节,相加总和写入 1 个字节;或者读取 5 个字节从中解析出数据再以二进制形式写入到其他文件中)
看了一圈,比较方便的也就是 structs 的 pack unpack 操作,但是发现转换一个 15MB 文件要消耗 30 多秒……而 C#版本大约就 1~2 秒左右,不知是否有更好的解决方案?(尝试过 numpy,不过除非是比较简单的 2 个字节相加成 1 个字节这种操作可以用 numpy 提供的 function 有很大提升,一些复杂计算操作还是无解啊~)
Python中有什么高性能的二进制流操作方式?
这种可能不适合 python,还是 C 写起来顺手
Python里搞二进制流操作,性能这块儿得看具体场景。最直接的就是用内置的 bytes 和 bytearray,内存视图 memoryview 在处理大块数据切片时能避免复制,提升明显。对于复杂结构,struct 模块打包/解包C结构体格式的数据很快。
如果追求极致性能,第三方库 numpy 的数组操作(特别是 dtype 设为字节类型时)在数值计算和批量处理上优势很大,底层是C实现的。array 模块的 array('B') 也比列表更省内存、更快。
简单读写文件就用 open('rb') 和 open('wb'),大文件记得分块。网络编程里 socket.recv() 和 send() 返回的也是字节,配合 io.BytesIO 当内存流用很方便。
总结:根据数据规模和操作类型选合适的工具。
C/C++ 比较适合,封装一下给 Python 调用就好了
这么慢?一次多读点不行吗……
可以换 PyPy 换取少量性能提高,或者直接在 Python 里用 CFFI 写 C 的实现,性能最好。
pypy 或 cython? 实在不行就 CFFI 调 C 函数吧
感觉性能主要被堵在 IO 了?尝试优化这个方向
复杂计算可以用 numpy.ndarray 替代 list 然后用 cython 把 python 转成原生的 C/C++ https://zhuanlan.zhihu.com/p/24311879
如果导出的数据不用跟其他语言交互,cPickle 也很好用
没用,卡在 unpack 和 pack 上,我是一次性全部读取到内存的
上 SSD 哈哈
你贴一个例子看看,NumPy 可以读取很复杂的结构数组的。

