我有一些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]))
让-弗朗索瓦·法布对环路的观察非常好,但我们可以更进一步。代码正在执行大约8000个写操作,大小不变,内容几乎相同。我们可以在一次操作中准备一个缓冲区。你知道吗
这意味着系统调用要少得多。很可能我们可以更进一步,例如,将内存作为缓冲区读取,并使用
b2a_hex
或类似的格式,而不是每个单词的字符串格式。也可以预先计算偏移量,而不是使用枚举。你知道吗你的循环效率很低。当值不在范围内时,实际上是在徒劳地迭代。你花了很多时间测试指数。你知道吗
不要做一个循环和两个测试。只需创建两个没有索引测试的循环(请注意,如果我们尊重您的测试,则会跳过第一个索引:
可能更具pythonic和更简洁(不使用
memory[j]
,因此有机会更快):外部循环保存了2个循环(因此如果有更多偏移,只需将它们添加到元组列表中)。
islice
对象创建了一个内存片,但没有复制。它每次迭代时不检查数组是否越界,因此可以更快。它还没有被定格,但是写入磁盘可能也要花费很多时间。你知道吗相关问题 更多 >
编程相关推荐