Python中识别全部-空字符串的最快方法

2024-09-28 05:22:14 发布

您现在位置:Python中文网/ 问答频道 /正文

假设性能关键代码段从磁盘文件中读取大小相等的数据块。如何在尽可能短的时间内检测所有空字符串/数据块?你知道吗

这是我当前的代码:

# options.blocksize = 1024*1024
f, dummy = do_open(dev, 'r')
zeroblock = '\0'*options.blocksize
while True:
    block = f.read(options.blocksize)
    if not block:
        break
    if block == zeroblock:
        csum = "0000"

如您所见,我将一个全空块与从文件中读取的块进行比较。这种方法是有效的,但是对于大的块,它在比较中花费了相当多的时间。你知道吗

我还尝试计算空出现次数:

# options.blocksize = 1024*1024
f, dummy = do_open(dev, 'r')
zeroblock = '\0'*options.blocksize
while True:
    block = f.read(options.blocksize)
    if not block:
        break
    if block.count('\0') == options.blocksize:
        csum = "0000"

但它甚至比第一种方法慢。你知道吗

关于如何提高绩效有什么建议吗? 谢谢。你知道吗


Tags: 数据devtruereadif时间notopen
1条回答
网友
1楼 · 发布于 2024-09-28 05:22:14

而不是if block == zeroblock:尝试if not sum(block):。把零加在一起应该很快。你知道吗

if not any(block):应该同样快,但是对于足够大的块可能会执行得更好。(它在第一个非零上显示快捷方式。)

请注意,这不适用于普通的unicode字符串,只适用于bytestringsb'',因为bytestring迭代器返回int而不是1个字符的字符串。这意味着您必须用'rb'而不是仅仅用'r'以二进制模式open()文件。你知道吗


python2没有bytes。它使用的旧的str类型是基于字节的,但是迭代器返回的是长度为1的字符串,而不是我们想要的整数。因此,在python2中您将希望使用字节数组。要么升级Python,要么试试这样的方法。你知道吗

from array import array

f, dummy = do_open(dev, 'rb')
while True:
    block = array('B')  # 'B' means bytes. (Actually "unsigned char" in C.)
    try:
        block.fromfile(f, options.blocksize)
    except EOFError:  # Fewer bytes were left than blocksize.
        pass # Remaining bytes were still appended though.
    if not block:
        break
    if not any(block):  # sum() might be faster depending on blocksize.
        csum = "0000"

如果知道文件平均划分为块大小,则不需要try/except部分。你知道吗


您还可以尝试array('L')将数据加载为无符号long而不是字节。这可能是sum所需迭代次数的四分之一,因为数组包含的元素更少(更大),但您必须确保与块大小一致。你知道吗

相关问题 更多 >

    热门问题