有什么高性能的二进制流操作方式?

2017-05-06 16:16:13 +08:00
 guoyijun163
因为习惯用 Python,日常工作中常常涉及转换二进制文件格式(比如读取 2 个字节,相加总和写入 1 个字节;或者读取 5 个字节从中解析出数据再以二进制形式写入到其他文件中)
看了一圈,比较方便的也就是 structs 的 pack unpack 操作,但是发现转换一个 15MB 文件要消耗 30 多秒……而 C#版本大约就 1~2 秒左右,不知是否有更好的解决方案?(尝试过 numpy,不过除非是比较简单的 2 个字节相加成 1 个字节这种操作可以用 numpy 提供的 function 有很大提升,一些复杂计算操作还是无解啊~)
3904 次点击
所在节点    Python
10 条回复
ryd994
2017-05-06 16:25:52 +08:00
这种可能不适合 python,还是 C 写起来顺手
TJT
2017-05-06 16:50:36 +08:00
C/C++ 比较适合,封装一下给 Python 调用就好了
hard2reg
2017-05-06 18:34:51 +08:00
这么慢?一次多读点不行吗……
zk8802
2017-05-06 18:39:45 +08:00
可以换 PyPy 换取少量性能提高,或者直接在 Python 里用 CFFI 写 C 的实现,性能最好。
billlee
2017-05-06 19:56:02 +08:00
pypy 或 cython? 实在不行就 CFFI 调 C 函数吧
crayygy
2017-05-06 20:13:32 +08:00
感觉性能主要被堵在 IO 了?尝试优化这个方向
abcdabcd987
2017-05-06 20:22:17 +08:00
复杂计算可以用 numpy.ndarray 替代 list 然后用 cython 把 python 转成原生的 C/C++ https://zhuanlan.zhihu.com/p/24311879
如果导出的数据不用跟其他语言交互,cPickle 也很好用
guoyijun163
2017-05-06 21:15:33 +08:00
@hard2reg 没用,卡在 unpack 和 pack 上,我是一次性全部读取到内存的
hard2reg
2017-05-06 21:56:05 +08:00
@crayygy 上 SSD 哈哈
ruoyu0088
2017-05-09 06:39:49 +08:00
你贴一个例子看看,NumPy 可以读取很复杂的结构数组的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/359574

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX