有兩件事可能會讓你失望:數組上的重複項或列表開銷。在任何一種情況下,可能正確的做法是在將您的列表轉儲到coo_matrix
並將其添加到您的總數之前,將您的列表擴大到如此之大。我花了幾個定時:
rows = list(np.random.randint(100, size=(10000,)))
cols = list(np.random.randint(100, size=(10000,)))
values = list(np.random.rand(10000))
%timeit sps.coo_matrix((values, (rows, cols)))
100 loops, best of 3: 4.03 ms per loop
%timeit (sps.coo_matrix((values[:5000], (rows[:5000], cols[:5000]))) +
sps.coo_matrix((values[5000:], (rows[5000:], cols[5000:]))))
100 loops, best of 3: 5.24 ms per loop
%timeit sps.coo_matrix((values[:5000], (rows[:5000], cols[:5000])))
100 loops, best of 3: 2.16 ms per loop
因此,有關於兩種分裂的列表,每個轉換爲coo_matrix
,然後將它們放在一起有25%的開銷。如果你做更多的分裂,它似乎並沒有那麼糟糕:
%timeit (sps.coo_matrix((values[:2500], (rows[:2500], cols[:2500]))) +
sps.coo_matrix((values[2500:5000], (rows[2500:5000], cols[2500:5000]))) +
sps.coo_matrix((values[5000:7500], (rows[5000:7500], cols[5000:7500]))) +
sps.coo_matrix((values[7500:], (rows[7500:], cols[7500:]))))
100 loops, best of 3: 5.76 ms per loop
海梅 - 再次感謝。我現在正在使用「增長列表這麼大」的方法,並且(至少這部分)我的代碼在合理的時間內運行而不會崩潰。 – YXD