Tôi đang tạo các ma trận Toeplitz ngẫu nhiên để ước tính xác suất chúng không thể đảo ngược. Mã hiện tại của tôi làTăng tốc độ tính toán ma trận ngẫu nhiên
import random
from scipy.linalg import toeplitz
import numpy as np
for n in xrange(1,25):
rankzero = 0
for repeats in xrange(50000):
column = [random.choice([0,1]) for x in xrange(n)]
row = [column[0]]+[random.choice([0,1]) for x in xrange(n-1)]
matrix = toeplitz(column, row)
if (np.linalg.matrix_rank(matrix) < n):
rankzero += 1
print n, (rankzero*1.0)/50000
Điều này có thể được tăng tốc không?
Tôi muốn tăng giá trị 50000 để có được độ chính xác cao hơn nhưng hiện quá chậm.
Profiling chỉ sử dụng for n in xrange(10,14)
lãm
400000 9.482 0.000 9.482 0.000 {numpy.linalg.lapack_lite.dgesdd}
4400000 7.591 0.000 11.089 0.000 random.py:272(choice)
200000 6.836 0.000 10.903 0.000 index_tricks.py:144(__getitem__)
1 5.473 5.473 62.668 62.668 toeplitz.py:3(<module>)
800065 4.333 0.000 4.333 0.000 {numpy.core.multiarray.array}
200000 3.513 0.000 19.949 0.000 special_matrices.py:128(toeplitz)
200000 3.484 0.000 20.250 0.000 linalg.py:1194(svd)
6401273/64.421 0.000 2.421 0.000 {len}
200000 2.252 0.000 26.047 0.000 linalg.py:1417(matrix_rank)
4400000 1.863 0.000 1.863 0.000 {method 'random' of '_random.Random' objects}
2201015 1.240 0.000 1.240 0.000 {isinstance}
[...]
Cảm ơn rất nhiều. Bạn có bất kỳ ý tưởng nào khi xếp hạng trở nên nhanh hơn bất kỳ cơ hội nào? Một điều rất nhỏ, 5000 phải phù hợp với 50000 ở phía dưới. – marshall
det() vs rank() - nó có thể phụ thuộc vào CPU của bạn. Tôi chỉ đề nghị làm một thử nghiệm nhỏ % thời gian det (np.random.randint (0,2, kích thước = (25,25)) vs % timeit matrix_rank (np.random.randint (0,2, size = (25,25)) Về 5000 vs 50000, tôi cố ý làm cho nó nhỏ hơn để thử nghiệm dễ dàng hơn –
det (np.random.randint (0,2, size = (25,25))) là khoảng 42 chúng tôi và matrix_rank (np .random.randint (0,2, size = (25,25)) là khoảng 190. Khá rõ ràng – marshall