Эти временные испытания на небольшом lil
(плотной, но я не думаю, что имеет значение), предполагают, что x[i,:]
не является постановка задачи. Да, по какой-то причине он медленный, когда используется для извлечения строки.
In [108]: x=sparse.lil_matrix(np.arange(120).reshape(24,5))
In [109]: timeit x[10,:]=10
1000 loops, best of 3: 235 us per loop
In [110]: timeit y=x.getrowview(10);y[:]=10
1000 loops, best of 3: 291 us per loop
In [111]: timeit x[10,:]
1000 loops, best of 3: 658 us per loop
In [112]: timeit x.getrowview(10)
10000 loops, best of 3: 51.4 us per loop
Источник для getrowview
полезно, показывая, как лежащие в основе структуры данных для этой матрицы обрабатываются.
def getrowview(self, i):
"""Returns a view of the 'i'th row (without copying).
"""
new = lil_matrix((1, self.shape[1]), dtype=self.dtype)
new.rows[0] = self.rows[i]
new.data[0] = self.data[i]
return new
Я думаю x[10,:]
использует x.__getitem__
или x.__setitem__
. Обе эти функции сложнее, чем эта getrowview
. Я предполагаю, что x.__getitem__
медленный, потому что он также индексирует столбцы (см. x._get1
). x[10,:]
занимает столько же времени, сколько x[10,0:5]
.
Показателем того, что может быть достигнуто, если вам нужно только установить одну строку, а также доступ rows
и data
непосредственно:
In [133]: timeit x.rows[10]=range(5);x.data[10]=[10]*5
1000000 loops, best of 3: 1.36 us per loop
Это далеко от общего, но дает представление о том, что вы можете сделать в Особые случаи.
еще несколько тайминги:
In [156]: timeit x[10,:]=x.getrow(12)[:,:]
1000 loops, best of 3: 940 us per loop
In [157]: timeit x[10,:]=x.getrow(12)
1000 loops, best of 3: 259 us per loop
Это дополнительный [:,:]
медленно. getrow
уже возвращает копию, поэтому, вероятно, она не нужна.
In [160]: timeit b=x.getrowview(10);b=x.getrow(12)
10000 loops, best of 3: 104 us per loop
In [169]: timeit x.rows[10],x.data[10] = x.rows[12][:],x.data[12][:]
1000000 loops, best of 3: 1.25 us per loop
Прямая модификация rows
и data
потребностей, которые будут испытаны тщательно.
В общем, я бы просто не использовал формат LIL, когда это было возможно. Конечно, вам нужно ориентироваться на ваш случай использования, но я ожидаю, что вы сможете использовать более быстрый формат. – perimosocordiae
Какой формат использовать? Я только изменяю один столбец матрицы A за раз и изменяю один столбец матрицы B за раз. Я считал 'csr_matrix' и' csc_matrix', но я нашел эту заметку: «Обратите внимание, что присвоение CSR/CSC-матрице вообще плохой идеей. Любое изменение структуры разреженности этих форматов требует O (nnz) операций, которые в основном означает восстановление матрицы с нуля ». –
Вы изменяете столбцы или строки? 'lil' хорош для строк, так как каждая строка представлена простыми элементами из 2 списков. Для работы с определенными столбцами требуется доступ к элементам во многих вложенных списках. – hpaulj