```python
我正在尝试使用以下代码填充预分配的字节数组:
```# preallocate a block array
dt = numpy.dtype('u8')
in_memory_blocks = numpy.zeros(_AVAIL_IN_MEMORY_BLOCKS, dt)
...
# write all the blocks out, flushing only as desired
blocks_per_flush_xrange = xrange(0, blocks_per_flush)
for _ in xrange(0, num_flushes):
for block_index in blocks_per_flush_xrange:
in_memory_blocks[block_index] = random.randint(0, _BLOCK_MAX)
print('flushing bytes stored in memory...')
# commented out for SO; exists in actual code
# removing this doesn't make an order-of-magnitude difference in time
# m.update(in_memory_blocks[:blocks_per_flush])
in_memory_blocks[:blocks_per_flush].tofile(f)
一些要点:
num_flushes
很低,大约在 4-10 之间blocks_per_flush
值很大,大约是百万级别的in_memory_blocks
可以是相当大的缓冲区(我将其设置为1MB到100MB),但时间非常稳定..._BLOCK_MAX
是一个8字节无符号整数的最大值m
是一个hashilib.md5()
使用上述代码生成1MB需要约1秒钟; 生成500MB需要约376秒。 相比之下,我的简单 C 程序使用 rand() 可以在 8 秒钟内创建一个 500MB 文件。
如何提高上面 loop 的性能? 我很确定我忽略了一些明显的东西,导致运行时巨大的差异。
numpy.random.randint
函数。但我怀疑这只是为了说明目的。您需要发布您实际填充数组的内容以获得更具体的帮助。 - Paul_BLOCK_MAX
是否等于255
或9223372036854775807
,以及dt
是否等于numpy.uint8
或numpy.uint64
? - jfsdt
是numpy.uint64
类型,而_BLOCK_MAX
是uint64
的上限。 - Allen George