所以我使用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倍?另外,有更简单的方法吗?
答案 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