假设性能关键代码段从磁盘文件中读取大小相等的数据块。如何在尽可能短的时间内检测所有空字符串/数据块?你知道吗
这是我当前的代码:
# 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"
但它甚至比第一种方法慢。你知道吗
关于如何提高绩效有什么建议吗? 谢谢。你知道吗
而不是
if block == zeroblock:
尝试if not sum(block):
。把零加在一起应该很快。你知道吗if not any(block):
应该同样快,但是对于足够大的块可能会执行得更好。(它在第一个非零上显示快捷方式。)请注意,这不适用于普通的unicode字符串,只适用于bytestrings
b''
,因为bytestring迭代器返回int而不是1个字符的字符串。这意味着您必须用'rb'
而不是仅仅用'r'
以二进制模式open()
文件。你知道吗python2没有
bytes
。它使用的旧的str
类型是基于字节的,但是迭代器返回的是长度为1的字符串,而不是我们想要的整数。因此,在python2中您将希望使用字节数组。要么升级Python,要么试试这样的方法。你知道吗如果知道文件平均划分为块大小,则不需要try/except部分。你知道吗
您还可以尝试
array('L')
将数据加载为无符号long而不是字节。这可能是sum
所需迭代次数的四分之一,因为数组包含的元素更少(更大),但您必须确保与块大小一致。你知道吗相关问题 更多 >
编程相关推荐