使用随机值填充Pytables数组:水平与垂直

时间:2014-05-30 15:18:57

标签: python numpy pytables

所以我使用Pytables存储一个大小为(10,000 x 100)的numpy数组。我的目标是用随机值填充它。

import tables as tb
h5File = '/Users/me/tmp0/test0.h5'
f = tb.openFile( h5File, 'w')
atom = tb.Atom.from_dtype( numpy.dtype('Float32'))
x = f.createCArray( f.root, 'prices', atom=atom, shape=(10000, 100) )

在这个示例中,我可以简单地执行x[:]=nr.random(10000,100),但实际上我的矩阵更大,更像(100,000,000 x 500)。所以我需要通过大块来做。首先我垂直尝试:

%%timeit
for k in xrange(100) :
    x[ :, k ] = nr.random( 10000 )

1 loops, best of 3: 255 ms per loop

然后我横向尝试了:

%%timeit
for k in xrange(0, 10000, 100) :
    x[ k:k+100, : ] = nr.random( ( 100, 100 ) )

100 loops, best of 3: 22.4 ms per loop

为什么横向速度快10倍?另外,有更简单的方法吗?

2 个答案:

答案 0 :(得分:0)

对于速度,它是因为计算机如何保持记忆的组织。 在内部,整个矩阵保存在线性存储器中。为了让你容易缠绕我的头:如果你有一个4x4矩阵:

1  2
3  4

在内部,它将存储为

memAddr1: 1
memAddr2: 2
memAddr3: 3
memAddr4: 4

因此,如果您在行中写入此内容,则可以非常有效地使用连续的内存地址(1-4)。如果你在列中写,你就会强制频繁的随机访问(1然后是3然后是2然后是4)。

答案 1 :(得分:0)

原因已经暴露出来:在内存中存储数据的方式的差异会对您获得的性能产生很大影响。要了解有关该问题的更多信息,请查看此演示文稿的幻灯片19(和邻域):

http://www.pytables.org/docs/StarvingCPUs-PyTablesUsages.pdf