加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python从fd直接读入bytearray

发布时间:2020-12-20 13:32:09 所属栏目:Python 来源:网络整理
导读:有没有办法从文件描述符(不是类似IO的对象)直接读入 bytearray? 现在我使用临时FileIO对象进行调解,例如: def fd_readinto(fd,ba): fio = io.FileIO(fd,closefd = False) return fio.readinto(ba) 解决方法 没有这样做的功能,你的方法是迄今为止最快的方法
有没有办法从文件描述符(不是类似IO的对象)直接读入 bytearray?

现在我使用临时FileIO对象进行调解,例如:

def fd_readinto(fd,ba):
    fio = io.FileIO(fd,closefd = False)
    return fio.readinto(ba)

解决方法

没有这样做的功能,你的方法是迄今为止最快的方法.

我打算使用bytearray和memoryview建议bytearray(mmap),array.fromfile,甚至是自制的os.read(),但FileIO.readinto正在快速尖叫.

import os
import mmap,io,array
import timeit

fn = 'path_to_largish_file'

def fd_readinto_mmap(fd,ba):
    m = mmap.mmap(fd,access=mmap.ACCESS_READ)
    ba.extend(m)
    m.close()

def fd_readinto_fio(fd,ba):
    with io.FileIO(fd,closefd = False) as fio:
    fio.readinto(ba)

def fd_readinto_array(fd,ba):
    ar = array.array('c')
    sz = os.fstat(fd).st_size
    fp = os.fdopen(fd,'rb')
    ar.fromfile(fp,sz)
    ba.extend(ar)

def fd_readinto_mv(fd,ba):
    stat = os.fstat(fd)
    blksize = getattr(stat,'st_blksize',4096)
    bufsize = stat.st_size
    buf = bytearray(bufsize)
    m = memoryview(buf)
    while True:
        b = os.read(fd,blksize)
        s = len(b)
        if not s: break
        m[:s],m = b,m[s:]
    writtenbytes = buffer(buf,bufsize-len(m))
    ba.extend(writtenbytes)

setup = """
from __main__ import fn,fd_readinto_mmap,fd_readinto_fio,fd_readinto_array,fd_readinto_mv,reset_fd
import os
openfd = lambda : os.open(fn,os.O_RDONLY)
closefd = lambda fd: os.close(fd)
"""


reps = 2
tests = {
    'fio' : "fd=openfd(); fd_readinto_fio(fd,bytearray()); closefd(fd)",'mmap': "fd=openfd(); fd_readinto_mmap(fd,'array': "fd=openfd(); fd_readinto_array(fd,bytearray());",'mv' : "fd=openfd(); fd_readinto_mv(fd,}

width = max(map(len,tests))
for n,t in tests.iteritems():
    time = timeit.timeit(t,setup,number=reps)
    print ("{:%s} {}" % width).format(n,time)

在我的系统上,FileIO的速度要快几个数量级. FileIO.readinto在文件大小方面似乎也几乎是恒定的时间. (不确定这是怎么回事.)

mmap  4.86922478676
array 4.19783091545
mv    7.75051403046
fio   9.29832458496e-05

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读