Sau nhiều lần thử tối ưu hóa mã, có vẻ như một tài nguyên cuối cùng sẽ cố gắng chạy mã dưới đây bằng cách sử dụng nhiều lõi. Tôi không biết chính xác làm thế nào để chuyển đổi/tái cấu trúc mã của tôi để nó có thể chạy nhanh hơn nhiều bằng cách sử dụng nhiều lõi. Tôi sẽ đánh giá cao nếu tôi có thể nhận được hướng dẫn để đạt được mục tiêu cuối cùng. Mục tiêu cuối cùng là có thể chạy mã này càng nhanh càng tốt cho các mảng A và B trong đó mỗi mảng chứa khoảng 700.000 phần tử. Đây là mã sử dụng các mảng nhỏ. Các mảng phần tử 700k được nhận xét.Python tương đương với hàm "ismember" của MATLAB
import numpy as np
def ismember(a,b):
for i in a:
index = np.where(b==i)[0]
if index.size == 0:
yield 0
else:
yield index
def f(A, gen_obj):
my_array = np.arange(len(A))
for i in my_array:
my_array[i] = gen_obj.next()
return my_array
#A = np.arange(700000)
#B = np.arange(700000)
A = np.array([3,4,4,3,6])
B = np.array([2,5,2,6,3])
gen_obj = ismember(A,B)
f(A, gen_obj)
print 'done'
# if we print f(A, gen_obj) the output will be: [4 0 0 4 3]
# notice that the output array needs to be kept the same size as array A.
Những gì tôi đang cố gắng làm là để bắt chước một hàm MATLAB gọi ismember [2] (Một trong đó được định dạng như:. [Lia,Locb] = ismember(A,B)
Tôi chỉ cố gắng để có được chỉ là phần Locb
.Từ Matlab: Locb, chứa chỉ số thấp nhất trong B cho mỗi giá trị trong A mà là thành viên của B. mảng đầu ra, Locb, chứa 0 bất cứ nơi nào A không là thành viên của B
một trong những chính vấn đề là tôi cần phải là abl e để thực hiện thao tác này hiệu quả nhất có thể. Để thử nghiệm, tôi có hai mảng 700k phần tử. Tạo ra một máy phát điện và đi qua các giá trị của máy phát điện dường như không hoàn thành công việc một cách nhanh chóng.
Chà, điều này thực sự rất nhanh! Bạn không có ý tưởng bao nhiêu tôi đánh giá cao giải pháp của bạn. Cảm ơn nhiều ! Bạn có sử dụng một công cụ cụ thể để xuất cấu hình hiệu suất không? – zd5151
@ z5151 Không, phân tích thuật toán đơn giản. Sử dụng [ký hiệu Big-O] (http://en.wikipedia.org/wiki/Big_O_notation): 'np.where' phải thực hiện quét tuyến tính' B', yêu cầu 'O (len (B))' hoạt động. Sau đó bạn sử dụng một vòng lặp bên ngoài yêu cầu các hoạt động 'O (len (A))', làm cho thuật toán ban đầu của bạn xấp xỉ các hoạt động 'O (len (A) * len (B))'. Việc tạo 'Bind' yêu cầu các hoạt động' len (B) '. Từ điển được triển khai dưới dạng [bảng băm] (http://en.wikipedia.org/wiki/Hash_table), có tra cứu 'O (1)' liên tục, do đó, quét A là 'O (len (A))'; độ phức tạp tổng thể là 'O (len (A) + len (B))'. – sfstewman
OK. Cảm ơn bạn đã tham khảo wikipedia. – zd5151