Có một giả định ở đây, rằng cách hiệu quả nhất để thực hiện rất nhiều "Liệu mảng có chứa X?" kiểm tra là chuyển đổi mảng thành băm. Hiệu quả phụ thuộc vào tài nguyên khan hiếm, thường là thời gian nhưng đôi khi không gian và đôi khi là nỗ lực lập trình. Bạn đang ít nhất tăng gấp đôi bộ nhớ tiêu thụ bằng cách giữ một danh sách và một băm của danh sách xung quanh cùng một lúc. Thêm vào đó bạn đang viết code hơn ban đầu mà bạn sẽ cần phải kiểm tra, tài liệu, vv
Là một thay thế, nhìn vào các module Danh sách :: MoreUtils, đặc biệt là chức năng any()
, none()
, true()
và false()
.Tất cả họ đều có một khối như các điều kiện và một danh sách như là đối số, tương tự như map()
và grep()
:
print "At least one value undefined" if any { !defined($_) } @list;
Tôi chạy một thử nghiệm nhanh, tải trong một nửa số/usr/share/dict/words để một mảng (25000 từ), sau đó tìm mười một từ được chọn từ trên toàn bộ từ điển (mỗi từ thứ 5000) trong mảng, sử dụng cả phương pháp mảng-tới-băm và hàm any()
từ Danh sách :: MoreUtils.
On Perl 5.8.8 xây dựng từ nguồn, phương pháp mảng-to-băm chạy gần như 1100x nhanh hơn so với phương pháp any()
(1300x nhanh hơn dưới Ubuntu 6.06 của đóng gói Perl 5.8.7.)
Đó không phải là Tuy nhiên, câu chuyện đầy đủ - việc chuyển đổi mảng thành băm mất khoảng 0,04 giây trong trường hợp này làm giảm hiệu quả thời gian của phương pháp mảng thành băm nhanh hơn 1.5x-2x so với phương pháp any()
. Vẫn tốt, nhưng không gần như là sao.
Cảm giác ruột của tôi là phương pháp mảng-băm sẽ đánh bại any()
trong hầu hết các trường hợp, nhưng tôi sẽ cảm thấy tốt hơn nếu tôi có một số chỉ số vững chắc hơn (nhiều trường hợp kiểm tra, phân tích thống kê hợp lý) , có thể một số phân tích thuật toán lớn-O của từng phương pháp, v.v.) Tùy thuộc vào nhu cầu của bạn, Danh sách :: MoreUtils có thể là giải pháp tốt hơn; nó chắc chắn linh hoạt hơn và đòi hỏi ít mã hóa hơn. Hãy nhớ rằng, tối ưu hóa sớm là một tội lỗi ... :)
này một là một lợi thế trong khác vì nó không tạo danh sách tạm thời để khởi tạo băm. Điều này sẽ nhanh hơn và tiêu thụ ít bộ nhớ hơn. –
Điều này không hoạt động khi được kiểm tra: kiểm tra.pl: @arr = ("foo", "bar", "baz"); @hash {@arr} = 1; lỗi cú pháp tại dòng test.pl 2, gần "@hash {" – Frosty
Frosty: Trước tiên bạn phải khai báo "băm% của tôi", sau đó thực hiện "@hash {@arr} = 1" (không "của tôi"). –