Tôi tương đối mới đối với Python và tôi đã có một vòng lặp lồng nhau. Vì các vòng lặp mất một lúc để chạy, tôi đang cố gắng tìm ra cách để vector hóa mã này để nó có thể chạy nhanh hơn.Vector hóa cho các vòng NumPy
Trong trường hợp này, toạ độ là mảng 3 chiều trong đó tọa độ [x, 0, 0] và toạ độ [x, 0, 1] là số nguyên và tọa độ [x, 0, 2] là 0 hoặc 1. H là một ma trận thưa thớt SciPy và x_dist, y_dist, z_dist và a là tất cả các phao.
# x_dist, y_dist, and z_dist are floats
# coord is a num x 1 x 3 numpy array where num can go into the hundreds of thousands
num = coord.shape[0]
H = sparse.lil_matrix((num, num))
for i in xrange(num):
for j in xrange(num):
if (np.absolute(coord[i, 0, 0] - coord[j, 0, 0]) <= 2 and
(np.absolute(coord[i, 0, 1] - coord[j, 0, 1]) <= 1)):
x = ((coord[i, 0, 0] * x_dist + coord[i, 0, 2] * z_dist) -
(coord[j, 0, 0] * x_dist + coord[j, 0, 2] * z_dist))
y = (coord[i, 0, 1] * y_dist) - (coord[j, 0, 1] * y_dist)
if a - 0.5 <= np.sqrt(x ** 2 + y ** 2) <= a + 0.5:
H[i, j] = -2.7
Tôi cũng đọc phát thanh đó bằng NumPy, nhanh hơn nhiều, có thể dẫn đến lượng bộ nhớ lớn sử dụng từ mảng tạm thời. Nó sẽ là tốt hơn để đi các tuyến đường vectorization hoặc thử và sử dụng một cái gì đó như Cython?
Cảm ơn mẹo! Tuy nhiên, khi tôi cố gắng để đặt điều này trong một kịch bản (bằng cách sử dụng trang trí @autojit) và thời gian nó với IPython (% timeit% run Test.py), tôi nhận được kết quả luôn chậm hơn so với Python thông thường. Bạn có bất kỳ ý tưởng tại sao điều này đang xảy ra? – sonicxml
@sonicxml Thật thú vị. Bạn đang sử dụng cùng một dữ liệu như trong ví dụ của tôi? Autojit cần biên dịch chức năng của bạn cho mỗi loại dữ liệu mới mà bạn truyền vào nó, và nó thực hiện điều này khi chạy. Do đó, đối với các ví dụ nhỏ, nó có thể chậm hơn do thời gian biên dịch. Đó có thể là vấn đề trên ví dụ bạn đang sử dụng không? – jcrudy
Ahh được rồi. Tôi đã chạy một mảng nhỏ hơn chỉ để kiểm tra nó, nhưng bây giờ tôi đã làm cho mảng lớn hơn numba đang trở nên nhanh hơn nhiều so với python. – sonicxml