[英]How to optimize my writing from RAM to disc?
我有一些python代码,用于从FPGA的RAM读取数据并将其写入计算机上的磁盘。 该代码的运行时间为2.56秒。 我需要将其降低到2秒。
mem = device.getNode("udaq.readout_mem").readBlock(16384)
device.dispatch()
ram.append(mem)
ram.reverse()
memory = ram.pop()
for j in range(16384):
if 0 < j < 4096:
f.write('0x%05x\t0x%08x\n' %(j, memory[j]))
if 8192 < j < 12288:
f.write('0x%05x\t0x%08x\n' %(j, memory[j]))
您的循环效率很低。 当值不在范围内时,您实际上是在不进行任何迭代。 而且您要花费大量时间来测试索引。
不要做一次循环和2次测试。 只需创建2个没有索引测试的循环(请注意,如果我们尊重您的测试,则会跳过第一个索引:
for j in range(1,4096):
f.write('0x%05x\t0x%08x\n' %(j, memory[j]))
for j in range(8193,12288):
f.write('0x%05x\t0x%08x\n' %(j, memory[j]))
也许更pythonic&更简洁(&&不使用memory[j]
所以它有机会变得更快):
import itertools
for start,end in ((1,4096),(8193,12288)):
sl = itertools.islice(memory,start,end)
for j,m in enumerate(sl,start):
f.write('0x%05x\t0x%08x\n' %(j, m))
外循环保存2个循环(因此,如果有更多偏移量,只需将它们添加到元组列表中)。 islice
对象创建内存的一部分,但不进行任何复制。 每次迭代时都无需检查索引是否超出数组范围,因此可以更快。 它尚未进行试验,但是写入磁盘可能也要花费很多时间。
让·弗朗索瓦·法布尔(Jean-FrançoisFabre)对循环的观察非常好,但是我们可以走得更远。 该代码正在执行大约8000次写操作,这些写操作的大小恒定,内容几乎相同。 我们可以准备一个缓冲区来完成一个操作。
# Prepare buffer with static portions
addresses = list(range(1,4096)) + list(range(8193,12288))
dataoffset = 2+5+1+2
linelength = dataoffset+8+1
buf = bytearray(b"".join(b'0x%05x\t0x%08x\n'%(j,0)
for j in addresses))
# Later on, fill in data
for line,address in enumerate(addresses):
offset = linelength*line+dataoffset
buf[offset:offset+8] = b"%08x"%memory[address]
f.write(buf)
这意味着更少的系统调用。 通过读取内存作为缓冲区并使用b2a_hex
或类似内容而不是每个单词使用字符串格式,我们可能会走得更远。 预先计算偏移量而不是使用枚举可能也很有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.