V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
guoyijun163
V2EX  ›  Python

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

  •  
  •   guoyijun163 · 2017-05-06 16:16:13 +08:00 · 3904 次点击
    这是一个创建于 2793 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为习惯用 Python,日常工作中常常涉及转换二进制文件格式(比如读取 2 个字节,相加总和写入 1 个字节;或者读取 5 个字节从中解析出数据再以二进制形式写入到其他文件中)
    看了一圈,比较方便的也就是 structs 的 pack unpack 操作,但是发现转换一个 15MB 文件要消耗 30 多秒……而 C#版本大约就 1~2 秒左右,不知是否有更好的解决方案?(尝试过 numpy,不过除非是比较简单的 2 个字节相加成 1 个字节这种操作可以用 numpy 提供的 function 有很大提升,一些复杂计算操作还是无解啊~)
    10 条回复    2017-05-09 06:39:49 +08:00
    ryd994
        1
    ryd994  
       2017-05-06 16:25:52 +08:00
    这种可能不适合 python,还是 C 写起来顺手
    TJT
        2
    TJT  
       2017-05-06 16:50:36 +08:00
    C/C++ 比较适合,封装一下给 Python 调用就好了
    hard2reg
        3
    hard2reg  
       2017-05-06 18:34:51 +08:00 via iPhone
    这么慢?一次多读点不行吗……
    zk8802
        4
    zk8802  
       2017-05-06 18:39:45 +08:00 via iPhone
    可以换 PyPy 换取少量性能提高,或者直接在 Python 里用 CFFI 写 C 的实现,性能最好。
    billlee
        5
    billlee  
       2017-05-06 19:56:02 +08:00
    pypy 或 cython? 实在不行就 CFFI 调 C 函数吧
    crayygy
        6
    crayygy  
       2017-05-06 20:13:32 +08:00 via iPhone
    感觉性能主要被堵在 IO 了?尝试优化这个方向
    abcdabcd987
        7
    abcdabcd987  
       2017-05-06 20:22:17 +08:00   ❤️ 1
    复杂计算可以用 numpy.ndarray 替代 list 然后用 cython 把 python 转成原生的 C/C++ https://zhuanlan.zhihu.com/p/24311879
    如果导出的数据不用跟其他语言交互,cPickle 也很好用
    guoyijun163
        8
    guoyijun163  
    OP
       2017-05-06 21:15:33 +08:00
    @hard2reg 没用,卡在 unpack 和 pack 上,我是一次性全部读取到内存的
    hard2reg
        9
    hard2reg  
       2017-05-06 21:56:05 +08:00
    @crayygy 上 SSD 哈哈
    ruoyu0088
        10
    ruoyu0088  
       2017-05-09 06:39:49 +08:00
    你贴一个例子看看,NumPy 可以读取很复杂的结构数组的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2557 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:47 · PVG 11:47 · LAX 19:47 · JFK 22:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.