简单范数是一个内存受限的问题,对numpy不是很有效。
改进它的唯一方法是进行一些阻塞,以避免多次重复数据:import numpy as np
a = np.random.rand(1000000,100)
print np.linalg.norm(a, axis =1).shape
def g(d, out=None):
bs = 2000
if out is None:
r = np.empty(d.shape[0])
else:
r = out
for i in range(0, d.shape[0], bs):
u = min(i + bs, d.shape[0])
r[i:u] = np.linalg.norm(d[i:u], axis=1)
return r
print (g(a) == numpy.linalg.norm(a, axis =1)).all()
print "blocked"
%timeit -n 10 g(a)
print "normal"
%timeit -n 10 numpy.linalg.norm(a, axis =1)
在我的机器(DDR2 ram)和numpy 1.9上,这导致了适度的改进:
^{pr2}$
原则上,使用线程添加另一层阻塞应该可以提高性能一点,但是在我的机器(glibc2.19)上,由于glibc经常在线程模式下修剪堆,这会导致页面错误过多,因此实际上没有帮助。在strace -f -e madvise ipython test_threaded.ipy 2>&1 | grep MADV_DONTNEED -c
14228