Tôi đã cố gắng để cải thiện hiệu suất của func
chức năng và tôi thấy rằng một sự thay đổi đơn giản trong cách danh sách aX
được tạo cải thiện hiệu suất khá một chút:Tại sao xử lý một danh sách ngẫu nhiên nhanh hơn nhiều so với việc xử lý một danh sách có thứ tự?
import timeit
import numpy as np
def func(a, b):
return [_ for _ in a if _ not in b]
Na, Nb = 10000, 5000
b = list(np.random.randint(1000, size=Nb))
# Ordered list of Na integers
a1 = [_ for _ in range(Na)]
# Random list of Na integers
a2 = list(np.random.randint(Na, size=Na))
# Ordered list of Na integers generated with numpy
a3 = list(np.arange(Na))
start_time = timeit.default_timer()
ab1 = func(a1, b)
abt1 = timeit.default_timer() - start_time
print("Time ab1", abt1)
start_time = timeit.default_timer()
ab2 = func(a2, b)
abt2 = timeit.default_timer() - start_time
print("Time ab2", abt2)
start_time = timeit.default_timer()
ab3 = func(a3, b)
abt3 = timeit.default_timer() - start_time
print("Time ab3", abt3)
print("Ratio 1/2:", abt1/abt2)
print("Ratio 1/3:", abt1/abt3)
Trong Python 2.7.13 này dẫn đến:
('Time ab1', 5.296088933944702)
('Time ab2', 1.5520200729370117)
('Time ab3', 1.5581469535827637)
('Ratio 1/2:', 3.412384302428827)
('Ratio 1/3:', 3.3989662667998095)
Trong Python 3.5.2 sự khác biệt thậm chí còn lớn hơn:
Time ab1 6.758207322000089
Time ab2 1.5693355060011527
Time ab3 1.5148192759988888
Ratio 1/2: 4.306413317073784
Ratio 1/3: 4.461395117608107
Tôi cần phải xử lý một số nguyên danh sách đặt hàng (tức là: a1
hoặc a3
), vì vậy câu hỏi của tôi là:
Tại sao danh sách ngẫu nhiên để xử lý nhanh hơn nhiều so với danh sách đã ra lệnh không tạo ra với numpy
?
Đây có thể là câu hỏi ngớ ngẩn nhưng bạn không thể * sắp xếp lại * hoặc * đơn đặt hàng * danh sách' ** sau ** bạn đã xử lý xong chưa? –
Đây có phải là thử nghiệm công bằng không? Giá trị tối đa trong danh sách 'a1' sẽ là 10000 (độ dài của danh sách) trong đó giá trị tối đa trong danh sách' a2' sẽ là 1000 vì nó sẽ là một số ngẫu nhiên từ 0 đến 1000, do đó thay thế 'a1 = [ _ cho _ trong phạm vi (Na)] 'với' a1 = [_ // 10 cho _ trong phạm vi (Na)] 'cho một tỷ lệ 4,6 vẫn không chắc chắn tại sao nó nhanh hơn. Hoặc có lẽ tôi hiểu lầm điều này. –
@ Alessi42 tạo một điểm hợp lệ. Tôi sẽ chỉnh sửa câu hỏi để khắc phục sự khác biệt này. Cảm ơn bạn! – Gabriel