Tôi đang cố triển khai tra cứu nhanh các bộ dữ liệu được sắp xếp trong từ điển; một cái gì đó mà trả lời câu hỏi "Liệu tuple (3,8) có một giá trị liên quan, và nếu có, nó là gì?". Để các số nguyên trong các bộ dữ liệu bị ràng buộc từ bên dưới bằng 0 và từ trên xuống bằng max_int.Tuples Python làm khóa chậm?
Tôi đã tiếp tục và sử dụng dict của Python nhưng thấy rằng khá chậm. Một cách tiếp cận khác cho vấn đề này là tạo một danh sách T với các dấu gạch ngang max_int (hầu hết là rỗng), và cho mỗi tuple (3,8) đặt T [3] [8] = giá trị. Tôi cho rằng đây chính xác là phương pháp băm-thùng mà Python sử dụng với dicts, nhưng sau này nhanh hơn khoảng 30 lần (!) Tại đây.
Ngoài ra, mặc dù, nó xấu xí (đặc biệt là kể từ khi tôi bây giờ về để thực hiện 3-tuples), vì vậy tôi rất nhiều đánh giá cao một số gợi ý ở đây.
Để tham khảo, đây là đoạn code tôi sử dụng để có được timings:
import numpy as np
import time
# create a bunch of sorted tuples
num_tuples = 10
max_int = 100
a = np.random.rand(num_tuples,2) * max_int
a = a.astype(int)
for k in xrange(len(a)):
a[k] = np.sort(a[k])
# create dictionary with tuples as keys
d = {}
for t in a:
d[tuple(t)] = 42
print d
# do some lookups
m = 100000
start_time = time.time()
for k in xrange(m):
(3,8) in d.keys()
elapsed = time.time() - start_time
print elapsed
# now create the bucket-list structure mentioned above
t = [{} for k in xrange(max_int)]
for k in xrange(len(a)):
t[a[k][0]][a[k][1]] = 42
print t
# do some lookups
m = 10000
start_time = time.time()
for k in xrange(m):
8 in t[3].keys()
elapsed = time.time() - start_time
print elapsed
Phần lớn thời gian của bạn bị lãng phí khi sử dụng 'in d.keys()' thay vì 'in d'; với tôi đã giảm thời gian từ 1.11s/0.003s xuống 0.018s/0.0017s. Nếu bạn đang để tối ưu hóa như vậy trên bàn thì thật ngớ ngẩn khi lo lắng về tốc độ. – DSM
Bạn có thể sử dụng 'timeit' để thực hiện các điểm chuẩn của mình. Cách dễ dàng hơn. –