编辑:bbtrb的方法(使用coo_matrix)是远远超过我原来的建议更快,使用非零。Sven
Marnach的使用建议
itertools.izip也提高了速度。目前最快的是
using_tocoo_izip:
import scipy.sparseimport randomimport itertoolsdef using_nonzero(x): rows,cols = x.nonzero() for row,col in zip(rows,cols): ((row,col), x[row,col])def using_coo(x): cx = scipy.sparse.coo_matrix(x) for i,j,v in zip(cx.row, cx.col, cx.data): (i,j,v)def using_tocoo(x): cx = x.tocoo() for i,j,v in zip(cx.row, cx.col, cx.data): (i,j,v)def using_tocoo_izip(x): cx = x.tocoo() for i,j,v in itertools.izip(cx.row, cx.col, cx.data): (i,j,v)N=200x = scipy.sparse.lil_matrix( (N,N) )for _ in xrange(N): x[random.randint(0,N-1),random.randint(0,N-1)]=random.randint(1,100)
产生以下
timeit结果:
% python -mtimeit -s'import test' 'test.using_tocoo_izip(test.x)'1000 loops, best of 3: 670 usec per loop% python -mtimeit -s'import test' 'test.using_tocoo(test.x)'1000 loops, best of 3: 706 usec per loop% python -mtimeit -s'import test' 'test.using_coo(test.x)'1000 loops, best of 3: 802 usec per loop% python -mtimeit -s'import test' 'test.using_nonzero(test.x)'100 loops, best of 3: 5.25 msec per loop



