Tôi đã tự hỏi liệu tôi có nên có cấu trúc dữ liệu của mình dưới dạng tập hợp hay danh sách hay không. Chủ yếu là tôi sẽ thiết lập các hoạt động, nhưng cuối cùng tôi sẽ cần phải sắp xếp nó.Sự khác biệt lớn về thời gian giữa việc sắp xếp tập hợp so với sắp xếp danh sách trong Python
Tôi tự hỏi liệu trước tiên tôi có nên đặt danh sách không, sau đó sử dụng sorted(list(my_set))
hoặc chỉ sắp xếp tập hợp ngay lập tức sorted(my_set)
. Có thể cho rằng, tôi có thể xem xét một giai đoạn "danh sách" chung, vì việc có một lệnh lặp lại vào thời điểm đó có thể có ý nghĩa.
Vì vậy, tôi đã quyết định thử nghiệm nó, hy vọng danh sách sẽ nhanh hơn.
Benchmarker:
import time
def sorter(x):
t1 = time.time()
for i in range(1000000):
sorted(x)
return time.time() - t1
dữ liệu:
one = range(1000)
a1 = list(one)
b1 = set(one)
sorter(a1)
# time: 16.5 s
sorter(b1)
# time: 20.7 s
sau đó tôi nhận ra nó có thể có để làm với thực tế rằng các yếu tố đã được tại chỗ, và nhớ this amazing question & answer.
Sau đó, tôi đã cố gắng một số dữ liệu ngẫu nhiên:
two = numpy.random.randint(1, 1000, 1000)
a2 = list(two)
b2 = set(two)
Với kết quả:
sorter(a2)
# time: 4min 49s
sorter(b2)
# time: 18.9 s
chênh lệch khổng lồ, những gì đang xảy ra?
Phần thưởng: Nó thậm chí xuất hiện tại thời điểm một phút, rằng sorted(set(a_list))
là ấn tượng nhanh hơn sorted(a_list)
.
Thực tế trong trường hợp thứ hai, có thể có các bản sao sẽ được lọc và do đó tăng tốc sắp xếp.
@Rufflewind Bah, tôi nên kiểm tra loại. Tôi luôn luôn giả định 'sắp xếp' để trả về một danh sách (vì tôi chỉ sử dụng nó trong danh sách một cách tự nhiên). Bây giờ tôi tò mò, nếu chúng ta lặp lại các thiết lập sau khi sắp xếp nó, sẽ thay đổi thứ tự? – PascalVKooten
@PascalVKooten Thực ra, nó trả về một danh sách. – PascalVKooten
Tôi đã rút lại nhận xét của mình vì có thể có lý do chính đáng để có phiên bản * được sắp xếp của bộ *, nhưng như bạn đã phát hiện, bộ đã sắp xếp không còn là bộ. – Rufflewind