Tôi đang tối ưu hóa một số mã có nút cổ chai chính đang chạy qua và truy cập vào một danh sách rất lớn các đối tượng giống như cấu trúc. Hiện tại tôi đang sử dụng các nhóm có tên để dễ đọc. Nhưng một số điểm chuẩn nhanh bằng cách sử dụng 'timeit' cho thấy rằng đây thực sự là một cách sai lầm khi coi hiệu suất là một yếu tố:
Được đặt tên tuple với a, b, c:
>>> timeit("z = a.c", "from __main__ import a")
0.38655471766332994
Lớp sử dụng __slots__
, với a, b, c:
>>> timeit("z = b.c", "from __main__ import b")
0.14527461047146062
Từ điển với các phím a, b, c:
>>> timeit("z = c['c']", "from __main__ import c")
0.11588272541098377
Tuple với ba giá trị, sử dụng khóa không đổi:
>>> timeit("z = d[2]", "from __main__ import d")
0.11106188992948773
Liệt kê với ba giá trị, sử dụng khóa hằng số:
>>> timeit("z = e[2]", "from __main__ import e")
0.086038238242508669
Tuple với ba giá trị, sử dụng khóa cục bộ:
>>> timeit("z = d[key]", "from __main__ import d, key")
0.11187358437882722
Liệt kê với ba giá trị, sử dụng khóa cục bộ:
>>> timeit("z = e[key]", "from __main__ import e, key")
0.088604143037173344
Trước hết, có điều gì về những timeit
thử nghiệm nhỏ này khiến chúng không hợp lệ không? Tôi đã chạy mỗi lần một vài lần, để đảm bảo không có sự kiện hệ thống ngẫu nhiên nào làm mất chúng và kết quả gần như giống hệt nhau.
Có vẻ như từ điển cung cấp sự cân bằng tốt nhất giữa hiệu suất và khả năng đọc, với các lớp đứng thứ hai. Điều này thật không may, vì theo mục đích của tôi, tôi cũng cần đối tượng phải có trình tự; do đó sự lựa chọn của tôi về nametuple.
Danh sách về cơ bản nhanh hơn đáng kể, nhưng các khóa không đổi là không thể xác định được; Tôi phải tạo một loạt các hằng số chỉ mục, tức là KEY_1 = 1, KEY_2 = 2, v.v. cũng không phải là lý tưởng.
Tôi bị mắc kẹt với những lựa chọn này, hay có một giải pháp thay thế nào mà tôi đã bỏ qua?