Sắp xếp () có chậm trong python không?

Đây là một phân tích bổ sung hơn là một câu trả lời thực tế nhưng nó dường như thay đổi tùy thuộc vào dữ liệu được sắp xếp. Đầu tiên, một bài đọc cơ sở

$ printf "%s\n" {1..1000000} > numbers.txt

$ time python sort.py s1.txt
real    0m0.521s
user    0m0.216s
sys     0m0.100s

$ time sort s2.txt
real    0m3.708s
user    0m4.908s
sys     0m0.156s

OK, python nhanh hơn nhiều. Tuy nhiên, bạn có thể làm cho coreutils

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
90 nhanh hơn bằng cách yêu cầu nó sắp xếp theo số

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s

Điều đó nhanh hơn nhiều nhưng trăn vẫn thắng với tỷ số cách biệt. Bây giờ, hãy thử lại nhưng với danh sách 1 triệu số chưa được sắp xếp

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s

Coreutils

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
91 nhanh hơn đối với dữ liệu số chưa được sắp xếp [mặc dù bạn có thể điều chỉnh tham số
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
92 của python sort để làm cho nó nhanh hơn]. Coreutils
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
90 vẫn chậm hơn đáng kể nếu không có cờ
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
1. Vậy còn những ký tự ngẫu nhiên, không phải số thuần túy thì sao?

$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s

Python vẫn đánh bại coreutils nhưng với biên độ nhỏ hơn nhiều so với những gì bạn thể hiện trong câu hỏi của mình. Đáng ngạc nhiên, nó vẫn nhanh hơn khi xem dữ liệu theo thứ tự bảng chữ cái thuần túy

$ tr -dc 'A-Za-z'  letters.txt

$ time sort   s2.txt 
real    0m2.561s
user    0m3.684s
sys     0m0.100s

$ time python sort.py s1.txt
real    0m1.297s
user    0m0.744s
sys     0m0.064s

Cũng cần lưu ý rằng cả hai không tạo ra cùng một đầu ra được sắp xếp

$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b

Thật kỳ lạ, tùy chọn

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
2 dường như không tạo ra nhiều [hoặc bất kỳ] sự khác biệt nào trong các bài kiểm tra của tôi. Tóm lại, có lẽ là do các thuật toán khác nhau được đề cập trong câu trả lời của goldilock, python
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
90 dường như nhanh hơn trong hầu hết các trường hợp nhưng GNU số
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
90 đánh bại nó trên các số chưa được sắp xếp1

OP có thể đã tìm ra nguyên nhân gốc rễ nhưng để hoàn thiện, đây là so sánh cuối cùng

________số 8

1Ai rành python-fu hơn mình thử chỉnh thử

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
5 xem có đạt được tốc độ tương tự bằng cách chỉ định cách sắp xếp không

Bạn có một cuốn từ điển, nhưng bạn muốn sắp xếp các cặp khóa-giá trị. Có lẽ bạn đã thử chuyển một từ điển tới hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 nhưng chưa nhận được kết quả như mong đợi. Trong hướng dẫn này, bạn sẽ tìm hiểu mọi thứ bạn cần biết nếu bạn muốn sắp xếp từ điển trong Python

Trong hướng dẫn này, bạn sẽ

  • Xem lại cách sử dụng hàm
    $ time sort s2.txt 
    real    0m3.743s
    user    0m4.964s
    sys     0m0.148s
    
    $ time sort -n s2.txt 
    real    0m0.733s
    user    0m0.836s
    sys     0m0.100s
    
    08
  • Tìm hiểu cách nhận các lượt xem từ điển để lặp lại
  • Hiểu cách từ điển được chuyển thành danh sách trong quá trình sắp xếp
  • Tìm hiểu cách chỉ định khóa sắp xếp để sắp xếp từ điển theo giá trị, khóa hoặc thuộc tính lồng nhau
  • Xem lại khả năng hiểu từ điển và hàm tạo
    $ time sort s2.txt 
    real    0m3.743s
    user    0m4.964s
    sys     0m0.148s
    
    $ time sort -n s2.txt 
    real    0m0.733s
    user    0m0.836s
    sys     0m0.100s
    
    20 để xây dựng lại từ điển của bạn
  • Xem xét các cấu trúc dữ liệu thay thế cho dữ liệu khóa-giá trị của bạn

Đồng thời, bạn cũng sẽ sử dụng mô-đun

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
21 để định thời gian cho mã của mình và nhận được kết quả rõ ràng để so sánh các phương pháp sắp xếp dữ liệu khóa-giá trị khác nhau. Bạn cũng sẽ xem xét liệu một từ điển được sắp xếp có thực sự là lựa chọn tốt nhất của bạn hay không, vì nó không phải là một mẫu đặc biệt phổ biến

Để tận dụng tối đa hướng dẫn này, bạn nên biết về từ điển, danh sách, bộ dữ liệu và hàm. Với kiến ​​thức đó, bạn sẽ có thể sắp xếp từ điển vào cuối hướng dẫn này. Một số tiếp xúc với các hàm bậc cao hơn, chẳng hạn như hàm lambda, cũng sẽ hữu ích nhưng không bắt buộc

Tải xuống miễn phí. Nhấp vào đây để tải xuống mã mà bạn sẽ sử dụng để sắp xếp các cặp khóa-giá trị trong hướng dẫn này

Đầu tiên, bạn sẽ học một số kiến ​​thức cơ bản trước khi thử sắp xếp từ điển trong Python

Khám phá lại thứ tự từ điển trong Python

Trước Python 3. 6, từ điển vốn đã không có thứ tự. Từ điển Python là một triển khai của bảng băm, theo truyền thống là cấu trúc dữ liệu không có thứ tự

Là một tác dụng phụ của việc triển khai từ điển nhỏ gọn trong Python 3. 6, từ điển bắt đầu bảo tồn thứ tự chèn. từ 3. 7, thứ tự chèn đó đã được đảm bảo

Nếu bạn muốn giữ một từ điển có thứ tự dưới dạng cấu trúc dữ liệu trước các từ điển nhỏ gọn, thì bạn có thể sử dụng

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
22 từ mô-đun
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
23. Tương tự như từ điển nhỏ gọn hiện đại, nó cũng giữ thứ tự chèn, nhưng không loại từ điển nào tự sắp xếp

Một cách khác để lưu trữ dữ liệu cặp khóa-giá trị được sắp xếp là lưu trữ các cặp dưới dạng danh sách các bộ dữ liệu. Như bạn sẽ thấy ở phần sau của hướng dẫn, sử dụng danh sách các bộ có thể là lựa chọn tốt nhất cho dữ liệu của bạn

Một điểm thiết yếu cần hiểu khi sắp xếp từ điển là mặc dù chúng bảo toàn thứ tự chèn, nhưng chúng không được coi là một chuỗi. Từ điển giống như một tập hợp các cặp khóa-giá trị và các bộ này không có thứ tự

Từ điển cũng không có nhiều chức năng sắp xếp lại. Chúng không giống như danh sách, nơi bạn có thể chèn các phần tử vào bất kỳ vị trí nào. Trong phần tiếp theo, bạn sẽ khám phá thêm về hậu quả của giới hạn này

Loại bỏ các quảng cáo

Hiểu ý nghĩa của việc sắp xếp một từ điển

Vì từ điển không có nhiều chức năng sắp xếp lại thứ tự nên khi sắp xếp từ điển ít khi thực hiện tại chỗ. Trên thực tế, không có phương pháp nào để di chuyển các mục trong từ điển một cách rõ ràng

Nếu bạn muốn sắp xếp một từ điển tại chỗ, thì bạn phải sử dụng từ khóa

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
24 để xóa một mục khỏi từ điển rồi thêm lại. Xóa và sau đó thêm lại sẽ di chuyển cặp khóa-giá trị đến cuối một cách hiệu quả

Lớp

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
22 có một phương pháp cụ thể để di chuyển một mục đến cuối hoặc đầu, điều này có thể làm cho
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
22 thích hợp hơn để giữ một từ điển được sắp xếp. Tuy nhiên, nó vẫn không phổ biến lắm và ít nhất là không hiệu quả lắm.

Phương pháp điển hình để sắp xếp từ điển là lấy chế độ xem từ điển, sắp xếp và sau đó chuyển danh sách kết quả trở lại từ điển. Vì vậy, bạn thực sự chuyển từ từ điển sang danh sách và quay lại từ điển. Tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể không cần chuyển đổi lại danh sách thành từ điển

Ghi chú. Từ điển được sắp xếp không phải là một mô hình rất phổ biến. Bạn sẽ khám phá thêm về chủ đề đó sau trong hướng dẫn

Với những phần sơ bộ đó, bạn sẽ sắp xếp từ điển trong phần tiếp theo

Sắp xếp từ điển trong Python

Trong phần này, bạn sẽ tập hợp các thành phần sắp xếp từ điển để cuối cùng, bạn có thể nắm vững cách sắp xếp từ điển phổ biến nhất

>>>

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
9

Đừng lo lắng nếu bạn không hiểu các đoạn mã trên—bạn sẽ xem lại tất cả từng bước trong các phần sau. Đồng thời, bạn sẽ học cách sử dụng hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 với các phím sắp xếp, hàm
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
28 và hàm tạo từ điển

Sử dụng hàm
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08

Chức năng quan trọng mà bạn sẽ sử dụng để sắp xếp từ điển là chức năng

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 được tích hợp sẵn. Hàm này lấy một đối số có thể lặp lại làm đối số chính, với hai đối số chỉ có từ khóa tùy chọn—một hàm
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
41 và một giá trị Boolean
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
42

Để minh họa hành vi của hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 một cách riêng biệt, hãy kiểm tra việc sử dụng nó trên một danh sách các số

>>>

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
7

Như bạn có thể thấy, hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 có thể lặp lại, sắp xếp các phần tử có thể so sánh như số theo thứ tự tăng dần và trả về một danh sách mới. Với các chuỗi, nó sắp xếp chúng theo thứ tự bảng chữ cái

>>>

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
0

Sắp xếp theo thứ tự ưu tiên số hoặc chữ cái là cách phổ biến nhất để sắp xếp các phần tử, nhưng có thể bạn cần kiểm soát nhiều hơn

Giả sử bạn muốn sắp xếp theo ký tự thứ hai của mỗi từ trong ví dụ trước. Để tùy chỉnh những gì hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 sử dụng để sắp xếp các phần tử, bạn có thể chuyển một hàm gọi lại cho tham số
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
41

Hàm gọi lại là một hàm được truyền dưới dạng đối số cho một hàm khác. Đối với

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08, bạn truyền cho nó một hàm hoạt động như một khóa sắp xếp. Hàm
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 sau đó sẽ gọi lại khóa sắp xếp cho mọi phần tử

Trong ví dụ sau, hàm được truyền dưới dạng khóa chấp nhận một chuỗi và sẽ trả về ký tự thứ hai của chuỗi đó

>>>

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
2

Hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 chuyển mọi phần tử của hàm lặp
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
60 sang hàm
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
41 và sử dụng giá trị trả về để so sánh. Sử dụng phím có nghĩa là hàm
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 sẽ so sánh chữ cái thứ hai thay vì so sánh trực tiếp toàn bộ chuỗi

Các ví dụ và giải thích khác về tham số

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
41 sẽ xuất hiện sau trong phần hướng dẫn khi bạn sử dụng tham số này để sắp xếp từ điển theo giá trị hoặc phần tử lồng nhau

Nếu bạn xem lại kết quả của lần sắp xếp cuối cùng này, bạn có thể nhận thấy tính ổn định của hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08. Ba phần tử,
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
65,
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
66 và
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
67, tương đương nhau khi được sắp xếp theo ký tự thứ hai của chúng. Vì chúng bằng nhau nên hàm
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 bảo toàn thứ tự ban đầu của chúng. Python đảm bảo sự ổn định này

Ghi chú. Mỗi danh sách cũng có một phương thức

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
69, có cùng chữ ký với hàm
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08. Sự khác biệt chính là phương pháp
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
69 sắp xếp danh sách tại chỗ. Ngược lại, hàm
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 trả về một danh sách mới, giữ nguyên danh sách ban đầu

Bạn cũng có thể chuyển

$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s
93 cho hàm hoặc phương thức sắp xếp để trả về thứ tự đảo ngược. Ngoài ra, bạn có thể sử dụng hàm
$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s
94 để đảo ngược khả năng lặp lại sau khi sắp xếp

>>>

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
4

Nếu bạn muốn tìm hiểu sâu hơn về cơ chế sắp xếp trong Python và tìm hiểu cách sắp xếp các loại dữ liệu không phải từ điển, thì hãy xem hướng dẫn về cách sử dụng

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 và
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
69

Vì vậy, làm thế nào về từ điển?

>>>

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
6

Nhưng hành vi mặc định của việc chuyển trực tiếp một từ điển đến hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 là lấy các khóa của từ điển, sắp xếp chúng và chỉ trả về một danh sách các khóa. Đó có thể không phải là hành vi bạn có trong tâm trí. Để lưu giữ tất cả thông tin trong từ điển, bạn cần làm quen với chế độ xem từ điển

Loại bỏ các quảng cáo

Lấy khóa, giá trị hoặc cả hai từ từ điển

Nếu bạn muốn bảo tồn tất cả thông tin từ một từ điển khi sắp xếp nó, bước đầu tiên thông thường là gọi phương thức

$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s
99 trên từ điển. Gọi
$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s
99 trên từ điển sẽ cung cấp một bộ dữ liệu có thể lặp lại đại diện cho các cặp khóa-giá trị

>>>

$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s
9

Phương thức

$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s
99 trả về một đối tượng dạng xem từ điển chỉ đọc, đóng vai trò như một cửa sổ vào từ điển. Chế độ xem này không phải là bản sao hay danh sách—nó là chế độ lặp lại chỉ đọc thực sự được liên kết với từ điển mà nó được tạo ra từ đó

>>>

$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
1

Bạn sẽ nhận thấy rằng mọi cập nhật đối với từ điển cũng được phản ánh trong chế độ xem vì chúng được liên kết. Chế độ xem đại diện cho một cách nhẹ nhàng để lặp lại từ điển mà không cần tạo danh sách trước

Ghi chú. Bạn có thể sử dụng

$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
12 để chỉ xem các giá trị và
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
13 để xem giá trị chỉ với các khóa

Điều quan trọng là bạn có thể sử dụng hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 với chế độ xem từ điển. Bạn gọi phương thức
$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s
99 và sử dụng kết quả làm đối số cho hàm
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08. Sử dụng
$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s
99 giữ tất cả thông tin từ từ điển

>>>

$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
8

Ví dụ này dẫn đến một danh sách các bộ được sắp xếp, với mỗi bộ đại diện cho một cặp khóa-giá trị của từ điển

Nếu bạn muốn kết thúc với một từ điển được sắp xếp theo giá trị, thì bạn vẫn gặp hai vấn đề. Hành vi mặc định dường như vẫn sắp xếp theo khóa chứ không phải giá trị. Vấn đề khác là bạn kết thúc với một danh sách các bộ dữ liệu, không phải từ điển. Đầu tiên, bạn sẽ tìm ra cách sắp xếp theo giá trị

Hiểu cách Python sắp xếp các bộ dữ liệu

Khi sử dụng phương thức

$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s
99 trên một từ điển và đưa nó vào hàm
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08, bạn đang chuyển vào một bộ dữ liệu có thể lặp lại và hàm
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 so sánh trực tiếp toàn bộ bộ dữ liệu

Khi so sánh các bộ dữ liệu, Python hoạt động rất giống như nó đang sắp xếp các chuỗi theo thứ tự bảng chữ cái. Đó là, nó sắp xếp chúng theo từ điển

Sắp xếp theo từ điển có nghĩa là nếu bạn có hai bộ dữ liệu,

$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
81 và
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
82, thì bạn bắt đầu bằng cách so sánh mục đầu tiên của mỗi bộ dữ liệu. Mục đầu tiên là
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
83 trong cả hai trường hợp, bằng nhau. Phần tử thứ hai,
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
84, cũng giống hệt nhau trong cả hai trường hợp. Các phần tử thứ ba lần lượt là
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
85 và
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
86. Vì
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
86 nhỏ hơn
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
85, bạn đã tìm thấy mặt hàng nào ít hơn mặt hàng kia

Vì vậy, để sắp xếp các bộ dữ liệu

$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
81 và
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
82 theo từ điển, bạn sẽ chuyển thứ tự của chúng thành
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
82 và
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
81

Do hành vi sắp xếp từ điển của Python cho các bộ dữ liệu, sử dụng phương thức

$ tr -dc 'A-Za-z0-9'  random.txt

$ time sort  s2.txt 
real    0m2.487s
user    0m3.480s
sys     0m0.128s

$ time python sort.py  s2.txt 
real    0m1.314s
user    0m0.744s
sys     0m0.068s
99 với hàm
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 sẽ luôn sắp xếp theo khóa trừ khi bạn sử dụng thêm thứ gì đó

Sử dụng Tham số
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
41 và Hàm Lambda

Ví dụ: nếu bạn muốn sắp xếp theo giá trị, thì bạn phải chỉ định khóa sắp xếp. Khóa sắp xếp là một cách để trích xuất một giá trị có thể so sánh. Ví dụ: nếu bạn có một chồng sách, thì bạn có thể sử dụng họ của tác giả làm khóa sắp xếp. Với hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08, bạn có thể chỉ định khóa sắp xếp bằng cách chuyển hàm gọi lại dưới dạng đối số
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
41

Ghi chú. Đối số

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
41 không liên quan gì đến khóa từ điển

Để xem hoạt động của một phím sắp xếp, hãy xem ví dụ này, ví dụ này tương tự như ví dụ bạn đã thấy trong phần giới thiệu hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08

>>>

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
1

Trong ví dụ này, bạn thử hai cách truyền tham số

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
41. Tham số
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
41 chấp nhận chức năng gọi lại. Hàm có thể là định danh hàm bình thường hoặc hàm lambda. Hàm lambda trong ví dụ này chính xác tương đương với hàm
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
702

Ghi chú. Hàm lambda còn được gọi là hàm ẩn danh vì chúng không có tên. Các hàm lambda là tiêu chuẩn cho các hàm mà bạn chỉ sử dụng một lần trong mã của mình

Các hàm lambda không mang lại lợi ích gì ngoài việc làm cho mọi thứ gọn gàng hơn, loại bỏ nhu cầu xác định riêng một hàm. Họ giữ mọi thứ độc đáo trên cùng một dòng

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
70

Đối với các hàm getter cơ bản như hàm trong ví dụ, lambdas có thể hữu ích. Nhưng lambdas có thể làm cho mã của bạn khó đọc hơn đối với bất kỳ thứ gì phức tạp hơn, vì vậy hãy cẩn thận khi sử dụng chúng

Lambdas cũng chỉ có thể chứa chính xác một biểu thức, làm cho bất kỳ câu lệnh nhiều dòng nào như câu lệnh

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
703 hoặc
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
704 vượt quá giới hạn. Ví dụ, bạn có thể giải quyết vấn đề này bằng cách sử dụng các biểu thức hiểu và
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
703, nhưng những biểu thức đó có thể tạo ra các dòng một lớp dài và khó hiểu

Hàm gọi lại

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
41 sẽ nhận từng phần tử của iterable mà nó sắp xếp. Công việc của hàm gọi lại là trả về thứ gì đó có thể so sánh được, chẳng hạn như một số hoặc một chuỗi. Trong ví dụ này, bạn đặt tên hàm là
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
702 vì tất cả những gì nó làm là lấy giá trị từ một bộ khóa-giá trị

Vì hành vi mặc định của

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 với các bộ dữ liệu là sắp xếp theo từ điển, nên tham số
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
41 cho phép bạn chọn một giá trị từ phần tử mà nó đang so sánh

Trong phần tiếp theo, bạn sẽ sử dụng các phím sắp xếp xa hơn một chút và sử dụng chúng để sắp xếp theo giá trị lồng nhau

Loại bỏ các quảng cáo

Chọn giá trị lồng nhau bằng khóa sắp xếp

Bạn cũng có thể đi xa hơn và sử dụng phím sắp xếp để chọn các giá trị lồng nhau có thể có hoặc không có mặt và trả về giá trị mặc định nếu chúng không có mặt

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
71

Trong ví dụ này, bạn có một từ điển có các phím số và một từ điển lồng nhau làm giá trị. Bạn muốn sắp xếp theo các kỹ năng kết hợp Python và JavaScript, các thuộc tính được tìm thấy trong từ điển phụ

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
710

Một phần khiến việc sắp xếp theo kỹ năng kết hợp trở nên khó khăn là các khóa

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
711 và
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
712 không có trong từ điển
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
710 cho tất cả mọi người. Từ điển
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
710 cũng được lồng vào nhau. Bạn sử dụng
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
715 để đọc các khóa và cung cấp
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
716 làm giá trị mặc định được sử dụng cho các kỹ năng còn thiếu

Bạn cũng đã sử dụng đối số

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
42 vì bạn muốn các kỹ năng Python hàng đầu xuất hiện trước

Ghi chú. Bạn đã không sử dụng hàm lambda trong ví dụ này. Mặc dù có thể, nhưng nó sẽ tạo ra một dòng mã dài có khả năng khó hiểu

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
72

Một hàm lambda chỉ có thể chứa một biểu thức, vì vậy bạn lặp lại tra cứu đầy đủ trong từ điển phụ

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
710 lồng nhau. Điều này làm tăng đáng kể chiều dài dòng

Hàm lambda cũng yêu cầu nhiều chỉ số dấu ngoặc vuông [

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
719] được xâu chuỗi, khiến nó khó đọc hơn mức cần thiết. Sử dụng lambda trong ví dụ này chỉ tiết kiệm một vài dòng mã và sự khác biệt về hiệu suất là không đáng kể. Vì vậy, trong những trường hợp này, việc sử dụng hàm bình thường sẽ hợp lý hơn

Bạn đã sử dụng thành công hàm bậc cao làm khóa sắp xếp để sắp xếp chế độ xem từ điển theo giá trị. Đó là phần khó khăn. Bây giờ chỉ còn một vấn đề cần giải quyết—chuyển đổi danh sách mà

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 mang lại thành từ điển

Chuyển đổi trở lại từ điển

Vấn đề duy nhất còn lại để giải quyết với hành vi mặc định của

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08 là nó trả về một danh sách, không phải từ điển. Có một số cách để chuyển đổi danh sách các bộ dữ liệu trở lại từ điển

Bạn có thể lặp lại kết quả bằng vòng lặp

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
704 và điền từ điển vào mỗi lần lặp

>>>

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
73

Phương pháp này cho phép bạn kiểm soát tuyệt đối và linh hoạt trong việc quyết định cách bạn muốn xây dựng từ điển của mình. Phương pháp này có thể khá dài để gõ ra, mặc dù. Nếu bạn không có bất kỳ yêu cầu đặc biệt nào để xây dựng từ điển của mình, thì bạn có thể muốn sử dụng một công cụ xây dựng từ điển để thay thế

>>>

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
74

Đẹp và gọn đó. Bạn cũng có thể sử dụng khả năng hiểu từ điển, nhưng điều đó chỉ có ý nghĩa nếu bạn muốn thay đổi hình dạng của từ điển hoặc hoán đổi các khóa và giá trị chẳng hạn. Trong phần hiểu sau, bạn trao đổi các khóa và giá trị

>>>

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
75

Tùy thuộc vào mức độ hiểu biết của bạn hoặc nhóm của bạn, điều này có thể khó đọc hơn so với việc chỉ sử dụng vòng lặp

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
704 bình thường

Xin chúc mừng, bạn đã có từ điển được sắp xếp của mình. Bây giờ bạn có thể sắp xếp nó theo bất kỳ tiêu chí nào bạn muốn

Bây giờ bạn có thể sắp xếp từ điển của mình, bạn có thể muốn biết liệu có bất kỳ ý nghĩa hiệu suất nào đối với việc sử dụng từ điển đã sắp xếp hay liệu có cấu trúc dữ liệu thay thế nào cho dữ liệu khóa-giá trị hay không

Xem xét các vấn đề về chiến lược và hiệu suất

Trong phần này, bạn sẽ xem nhanh một số điều chỉnh hiệu suất, cân nhắc chiến lược và các câu hỏi để tự hỏi bản thân về cách bạn sẽ sử dụng dữ liệu khóa-giá trị của mình

Ghi chú. Nếu bạn quyết định chọn bộ sưu tập theo yêu cầu, hãy xem gói Hộp đựng được phân loại, bao gồm một

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
724

Bạn sẽ tận dụng mô-đun

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
21 để sử dụng một số chỉ số. Điều quan trọng cần lưu ý là để đưa ra bất kỳ kết luận chắc chắn nào về hiệu suất, bạn cần thử nghiệm trên nhiều loại phần cứng và với nhiều loại và kích cỡ mẫu khác nhau

Cuối cùng, lưu ý rằng bạn sẽ không đi vào chi tiết về cách sử dụng

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
21. Để biết điều đó, hãy xem hướng dẫn về bộ định thời Python. Tuy nhiên, bạn sẽ có một số ví dụ để thử

Loại bỏ các quảng cáo

Sử dụng các chức năng Getter đặc biệt để tăng hiệu suất và khả năng đọc

Bạn có thể nhận thấy rằng hầu hết các chức năng phím sắp xếp mà bạn đã sử dụng cho đến nay không hoạt động nhiều lắm. Tất cả chức năng làm là lấy một giá trị từ một tuple. Tạo hàm getter là một mẫu phổ biến đến nỗi Python có một cách đặc biệt để tạo các hàm đặc biệt nhận giá trị nhanh hơn các hàm thông thường

Hàm

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 có thể tạo ra các phiên bản hiệu quả cao của hàm getter

Bạn chuyển một đối số

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727, thường là vị trí khóa hoặc chỉ mục mà bạn muốn chọn. Hàm
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 sau đó sẽ trả về một đối tượng getter mà bạn gọi như một hàm

Đúng vậy, đó là một hàm trả về một hàm. Sử dụng hàm

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 là một ví dụ khác về cách làm việc với các hàm bậc cao hơn

Đối tượng getter từ

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 sẽ gọi phương thức
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
732 trên mục được truyền cho nó. Khi một cái gì đó thực hiện cuộc gọi đến
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
732, nó cần chuyển vào khóa hoặc chỉ mục của những gì cần nhận. Đối số được sử dụng cho
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
732 chính là đối số mà bạn đã chuyển đến
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727

>>>

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
76

Trong ví dụ này, bạn bắt đầu với một bộ, tương tự như bộ mà bạn có thể nhận được như một phần của chế độ xem từ điển

Bạn tạo getter đầu tiên bằng cách chuyển

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
716 làm đối số cho
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727. Khi getter kết quả nhận được bộ dữ liệu, nó trả về mục đầu tiên trong bộ dữ liệu—giá trị tại chỉ mục
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
716. Nếu bạn gọi
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 với đối số là ________ 683, thì nó sẽ nhận giá trị ở vị trí chỉ mục _______ 683

Bạn có thể sử dụng itemgetter này làm khóa cho hàm

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
08

>>>

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
77

Trong ví dụ này, bạn bắt đầu bằng cách sử dụng

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 với
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
716 làm đối số. Vì nó hoạt động trên mỗi bộ từ biến
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
745, nên nó lấy phần tử đầu tiên từ mỗi bộ. Sau đó, ví dụ minh họa việc khởi tạo một
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
746 với đối số
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
83, chọn mục thứ hai trong bộ dữ liệu

Cuối cùng, ví dụ cho thấy điều gì sẽ xảy ra nếu bạn sử dụng

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 với
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
84 làm đối số. Vì các bộ dữ liệu này chỉ có hai vị trí chỉ mục, cố gắng lấy phần tử thứ ba, với chỉ mục
$ echo -e "A\nB\na\nb\n-" | sort -n
-
a
A
b
B

$ echo -e "A\nB\na\nb\n-" | python sort.py 
-
A
B
a
b
84, dẫn đến ____2751

Bạn có thể sử dụng hàm do

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 tạo ra thay cho các hàm getter mà bạn đã sử dụng cho đến bây giờ

>>>

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
78

Hàm

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 tạo ra một hàm có tác dụng chính xác giống như hàm
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
702 từ các phần trước. Lý do chính khiến bạn muốn sử dụng hàm từ
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 là vì nó hiệu quả hơn. Trong phần tiếp theo, bạn sẽ bắt đầu đưa ra một số con số về mức độ hiệu quả của nó

Đo lường hiệu suất khi sử dụng
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727

Vì vậy, bạn kết thúc với một hàm hoạt động giống như phiên bản gốc của

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
702 từ các phần trước, ngoại trừ phiên bản được trả về từ
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 hiệu quả hơn. Bạn có thể sử dụng mô-đun
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
21 để so sánh hiệu suất của chúng

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
79

Mã này sử dụng mô-đun

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
21 để so sánh các quy trình sắp xếp của hàm từ
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 và hàm lambda

Chạy tập lệnh này từ trình bao sẽ cho bạn kết quả tương tự như kết quả bên dưới

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
00

Tiết kiệm khoảng 40 phần trăm là đáng kể

Hãy nhớ rằng khi định thời gian thực thi mã, thời gian có thể khác nhau đáng kể giữa các hệ thống. Điều đó nói rằng, trong trường hợp này, tỷ lệ phải tương đối ổn định giữa các hệ thống

Từ kết quả của bài kiểm tra này, bạn có thể thấy rằng sử dụng

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
727 tốt hơn từ quan điểm hiệu suất. Ngoài ra, nó là một phần của thư viện chuẩn Python, vì vậy không mất phí khi sử dụng nó

Ghi chú. Sự khác biệt giữa việc sử dụng lambda và chức năng bình thường làm khóa sắp xếp là không đáng kể trong thử nghiệm này

Bạn có muốn so sánh hiệu suất của một số thao tác mà bạn chưa đề cập ở đây không?

Giờ đây, bạn có thể tăng thêm một chút hiệu suất từ ​​việc sắp xếp từ điển của mình, nhưng bạn nên lùi lại một bước và cân nhắc xem việc sử dụng từ điển đã sắp xếp làm cấu trúc dữ liệu ưa thích của mình có phải là lựa chọn tốt nhất hay không. Rốt cuộc, một từ điển được sắp xếp không phải là một mẫu rất phổ biến

Tiếp theo, bạn sẽ tự hỏi mình một số câu hỏi về những gì bạn muốn làm với từ điển đã sắp xếp của mình và liệu đó có phải là cấu trúc dữ liệu tốt nhất cho trường hợp sử dụng của bạn không

Loại bỏ các quảng cáo

Đánh giá xem bạn có muốn sử dụng từ điển được sắp xếp hay không

Nếu bạn đang xem xét việc tạo cấu trúc dữ liệu khóa-giá trị được sắp xếp, thì có một vài điều bạn có thể muốn xem xét

Nếu bạn sắp thêm dữ liệu vào từ điển và bạn muốn dữ liệu đó được sắp xếp, thì tốt hơn hết bạn nên sử dụng cấu trúc như danh sách bộ dữ liệu hoặc danh sách từ điển

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
01

Danh sách từ điển là mẫu phổ biến nhất vì khả năng tương thích giữa các ngôn ngữ của nó, được gọi là khả năng tương tác ngôn ngữ

Chẳng hạn, khả năng tương tác ngôn ngữ đặc biệt phù hợp nếu bạn tạo HTTP REST API. Cung cấp dữ liệu của bạn trên Internet có thể có nghĩa là tuần tự hóa dữ liệu đó trong JSON

Nếu ai đó sử dụng JavaScript để sử dụng dữ liệu JSON từ API REST, thì cấu trúc dữ liệu tương đương sẽ là một đối tượng. Vấn đề là các đối tượng JavaScript không được sắp xếp theo thứ tự, do đó, thứ tự sẽ bị xáo trộn

Hành vi xáo trộn này sẽ đúng với nhiều ngôn ngữ và các đối tượng thậm chí còn được xác định trong đặc tả JSON dưới dạng cấu trúc dữ liệu không có thứ tự. Vì vậy, nếu bạn cẩn thận đặt hàng từ điển của mình trước khi tuần tự hóa thành JSON, thì sẽ không có vấn đề gì khi nó xâm nhập vào hầu hết các môi trường khác

Ghi chú. Đăng nhập một chuỗi các cặp khóa-giá trị được sắp xếp theo thứ tự có thể không chỉ phù hợp để tuần tự hóa các từ điển Python thành JSON. Hãy tưởng tượng bạn có những người trong nhóm của bạn đã quen với các ngôn ngữ khác. Một từ điển có thứ tự có thể là một khái niệm xa lạ đối với họ, vì vậy bạn có thể cần phải nói rõ ràng rằng bạn đã tạo một cấu trúc dữ liệu có thứ tự

Một cách để rõ ràng về việc có một từ điển theo thứ tự trong Python là sử dụng tên thích hợp là

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
22

Một tùy chọn khác là đơn giản là không cần lo lắng về việc sắp xếp dữ liệu nếu bạn không cần. Bao gồm

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
764,
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
765 hoặc các thuộc tính tương đương khác cho từng đối tượng có thể đủ để thể hiện thứ tự. Nếu thứ tự bị lẫn lộn vì bất kỳ lý do gì, thì sẽ luôn có một cách rõ ràng để sắp xếp nó

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
02

Ví dụ: với thuộc tính

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
765, rõ ràng là
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
767 phải ở vị trí đầu tiên trong dòng. Rõ ràng về thứ tự dự định của bạn rất phù hợp với câu ngạn ngữ cũ của Python về rõ ràng tốt hơn là ẩn ý, ​​từ Zen of Python

Tuy nhiên, sự đánh đổi về hiệu suất khi sử dụng danh sách từ điển so với từ điển của từ điển là gì?

So sánh hiệu suất của các cấu trúc dữ liệu khác nhau

Nếu hiệu suất là một yếu tố cần cân nhắc—chẳng hạn như có thể bạn sẽ làm việc với các tập dữ liệu lớn—thì bạn nên cân nhắc cẩn thận những gì mình sẽ làm với từ điển

Hai câu hỏi chính bạn sẽ tìm cách trả lời trong vài phần tiếp theo là

  1. Bạn sẽ sắp xếp một lần và sau đó thực hiện nhiều lần tra cứu chứ?
  2. Bạn sẽ sắp xếp nhiều lần và thực hiện rất ít tra cứu?

Sau khi bạn đã quyết định các kiểu sử dụng mà bạn sẽ tuân theo cấu trúc dữ liệu của mình, thì bạn có thể sử dụng mô-đun

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
21 để kiểm tra hiệu suất. Các phép đo này có thể thay đổi rất nhiều với hình dạng và kích thước chính xác của dữ liệu đang được kiểm tra

Trong ví dụ này, bạn sẽ so sánh một từ điển của các từ điển với một danh sách các từ điển để xem chúng khác nhau như thế nào về hiệu suất. Bạn sẽ tính thời gian cho các thao tác sắp xếp và thao tác tra cứu với dữ liệu mẫu sau

Dữ liệu mẫuHiển thị/Ẩn

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
03

Mỗi cấu trúc dữ liệu đều có thông tin giống nhau, ngoại trừ một cấu trúc là từ điển của từ điển và cấu trúc còn lại là danh sách từ điển. Đầu tiên, bạn sẽ nhận được một số số liệu về hiệu suất sắp xếp hai cấu trúc dữ liệu này

Loại bỏ các quảng cáo

So sánh hiệu suất sắp xếp

Trong đoạn mã sau, bạn sẽ sử dụng

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
21 để so sánh thời gian cần thiết để sắp xếp hai cấu trúc dữ liệu theo thuộc tính
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
770

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
04

Mã này nhập cấu trúc dữ liệu mẫu để sắp xếp trên thuộc tính

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
770. Có vẻ như bạn không sử dụng dữ liệu nhập từ
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
772, nhưng những mẫu này cần phải ở trong không gian tên chung để ngữ cảnh
$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
21 có quyền truy cập vào chúng

Chạy mã cho thử nghiệm này trên dòng lệnh sẽ cung cấp cho bạn một số kết quả thú vị

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
05

Việc sắp xếp một danh sách có thể nhanh gấp đôi so với quy trình cần thiết để sắp xếp một chế độ xem từ điển và sau đó tạo một từ điển được sắp xếp mới. Vì vậy, nếu bạn có kế hoạch sắp xếp dữ liệu của mình rất thường xuyên, thì một danh sách các bộ dữ liệu có thể tốt hơn một từ điển dành cho bạn

Ghi chú. Không có nhiều kết luận chắc chắn có thể được rút ra từ một tập dữ liệu như thế này. Ngoài ra, kết quả có thể rất khác nhau với dữ liệu có kích thước hoặc hình dạng khác nhau

Những ví dụ này là một cách để bạn nhúng ngón chân vào mô-đun

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
21 và bắt đầu xem cách thức và lý do bạn có thể sử dụng nó. Điều này sẽ cung cấp cho bạn một số công cụ cần thiết để đánh giá cấu trúc dữ liệu của bạn, nhằm giúp bạn quyết định cấu trúc dữ liệu nào sẽ giải quyết cho các cặp khóa-giá trị của mình

Nếu bạn cần hiệu suất cao hơn, hãy tiếp tục và tính thời gian cho các cấu trúc dữ liệu cụ thể của bạn. Điều đó nói rằng, hãy cẩn thận với việc tối ưu hóa sớm

Một trong những chi phí chính khi sắp xếp từ điển, trái ngược với danh sách, là xây dựng lại từ điển sau khi sắp xếp nó. Nếu bạn loại bỏ hàm tạo

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
20 bên ngoài, thì bạn sẽ cắt giảm đáng kể thời gian thực hiện

Trong phần tiếp theo, bạn sẽ xem xét thời gian cần thiết để tra cứu các giá trị trong từ điển của từ điển so với trong danh sách từ điển

So sánh hiệu suất tra cứu

Tuy nhiên, nếu bạn dự định sử dụng từ điển để sắp xếp dữ liệu của mình một lần và sử dụng từ điển đó chủ yếu để tra cứu, thì một từ điển chắc chắn sẽ có ý nghĩa hơn một danh sách

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
06

Mã này thực hiện một loạt tra cứu cho cả danh sách và từ điển. Bạn sẽ lưu ý rằng với danh sách, bạn phải viết một hàm đặc biệt để thực hiện tra cứu. Chức năng thực hiện tra cứu danh sách liên quan đến việc duyệt qua từng phần tử danh sách cho đến khi bạn tìm thấy phần tử đích, điều này không lý tưởng

Chạy tập lệnh so sánh này từ dòng lệnh sẽ mang lại kết quả cho thấy việc tra cứu từ điển nhanh hơn đáng kể

$ time sort s2.txt 
real    0m3.743s
user    0m4.964s
sys     0m0.148s

$ time sort -n s2.txt 
real    0m0.733s
user    0m0.836s
sys     0m0.100s
07

Gần mười tám lần nhanh hơn. Đó là cả một đống. Vì vậy, bạn chắc chắn muốn cân nhắc tốc độ tra cứu từ điển nhanh chóng so với việc sắp xếp chậm hơn của cấu trúc dữ liệu. Hãy nhớ rằng tỷ lệ này có thể thay đổi đáng kể từ hệ thống này sang hệ thống khác, chưa kể đến sự thay đổi có thể đến từ các từ điển hoặc danh sách có kích thước khác nhau

Tuy nhiên, tra cứu từ điển chắc chắn nhanh hơn, bất kể bạn cắt nó như thế nào. Điều đó nói rằng, nếu bạn chỉ tra cứu, thì bạn có thể dễ dàng làm điều đó với một từ điển chưa được sắp xếp thông thường. Tại sao bạn cần một từ điển được sắp xếp trong trường hợp đó?

Ghi chú. Bạn có thể thử và tối ưu hóa tra cứu danh sách, chẳng hạn bằng cách triển khai thuật toán tìm kiếm nhị phân để cắt giảm thời gian tra cứu danh sách. Tuy nhiên, mọi lợi ích sẽ chỉ trở nên đáng chú ý ở quy mô danh sách đáng kể

Với kích thước danh sách như kích thước được kiểm tra ở đây, việc sử dụng tìm kiếm nhị phân với mô-đun

$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
776 chậm hơn đáng kể so với vòng lặp
$ sort -R numbers.txt > randomized.txt

$ time sort -n s2.txt 
real    0m1.493s
user    0m1.920s
sys     0m0.116s

$ time python sort.py s1.txt
real    0m2.652s
user    0m1.988s
sys     0m0.064s
704 thông thường

Bây giờ, bạn đã có một ý tưởng tương đối tốt về một số sự đánh đổi giữa hai cách để lưu trữ dữ liệu khóa-giá trị của mình. Kết luận mà bạn có thể đạt được là, hầu hết thời gian, nếu bạn muốn cấu trúc dữ liệu được sắp xếp, thì có lẽ bạn nên tránh xa từ điển, chủ yếu vì lý do khả năng tương tác ngôn ngữ

Điều đó nói rằng, hãy thử từ điển được sắp xếp ở trên của Grant Jenks. Nó sử dụng một số chiến lược khéo léo để khắc phục những hạn chế về hiệu suất điển hình

Bạn có bất kỳ triển khai thú vị hoặc hiệu suất nào của cấu trúc dữ liệu khóa-giá trị được sắp xếp không?

Loại bỏ các quảng cáo

Phần kết luận

Bạn đã chuyển từ cách cơ bản nhất để sắp xếp từ điển sang một vài lựa chọn thay thế nâng cao xem xét hiệu suất trong việc sắp xếp các cặp khóa-giá trị

Trong hướng dẫn này, bạn đã

  • Đã xem lại chức năng
    $ time sort s2.txt 
    real    0m3.743s
    user    0m4.964s
    sys     0m0.148s
    
    $ time sort -n s2.txt 
    real    0m0.733s
    user    0m0.836s
    sys     0m0.100s
    
    08
  • Chế độ xem từ điển đã khám phá
  • Hiểu cách từ điển được chuyển thành danh sách trong quá trình sắp xếp
  • Các phím sắp xếp được chỉ định để sắp xếp từ điển theo giá trị, khóa hoặc thuộc tính lồng nhau
  • Đã sử dụng khả năng hiểu từ điển và hàm tạo
    $ time sort s2.txt 
    real    0m3.743s
    user    0m4.964s
    sys     0m0.148s
    
    $ time sort -n s2.txt 
    real    0m0.733s
    user    0m0.836s
    sys     0m0.100s
    
    20 để xây dựng lại từ điển của bạn
  • Cân nhắc liệu từ điển đã sắp xếp có phải là cấu trúc dữ liệu phù hợp cho dữ liệu khóa-giá trị của bạn hay không

Giờ đây, bạn không chỉ sẵn sàng sắp xếp từ điển theo bất kỳ tiêu chí nào bạn có thể nghĩ đến mà còn để đánh giá xem từ điển đã sắp xếp có phải là lựa chọn tốt nhất cho bạn hay không

Chia sẻ các trường hợp sử dụng từ điển được sắp xếp của bạn và so sánh hiệu suất trong các nhận xét bên dưới

Tải xuống miễn phí. Nhấp vào đây để tải xuống mã mà bạn sẽ sử dụng để sắp xếp các cặp khóa-giá trị trong hướng dẫn này

Đánh dấu là đã hoàn thành

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Ian Currie

Ian là một mọt sách Python, người sử dụng nó cho mọi thứ, từ mày mò đến giúp mọi người và công ty quản lý công việc hàng ngày cũng như phát triển doanh nghiệp của họ

» Thông tin thêm về Ian

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

Bartosz

Geir Arne

kate

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Tốc độ sắp xếp Python [] nhanh như thế nào?

Sắp xếp tích hợp sẵn của Python. 0. 009s . sắp xếp cơ số. 0. những năm 220. Sắp xếp nhanh chóng. 0. 247s. phân loại vỏ. 0. những năm 250.

Sort[] hay sorted[] nhanh hơn?

sắp xếp nhanh hơn một chút so với sắp xếp và tiêu thụ bộ nhớ ít hơn khoảng 24%. Tuy nhiên, hãy nhớ rằng danh sách. sắp xếp chỉ được triển khai cho danh sách, trong khi sắp xếp chấp nhận bất kỳ lần lặp nào.

Max có nhanh hơn sắp xếp không?

sắp xếp có thể dựa vào biểu diễn bên trong của danh sách trong khi max sẽ phải trải qua giao thức trình vòng lặp chung. Điều này làm cho từng phần tử tìm nạp cho l. sắp xếp nhanh hơn so với tìm nạp từng phần tử mà max .

Python có phá hoại sắp xếp không?

sắp xếp[] là một quá trình phá hủy giúp sắp xếp danh sách ban đầu tại chỗ. Lưu ý rằng đảo ngược[] trả về Không có. Theo mặc định, danh sách được sắp xếp theo thứ tự tăng dần.

Chủ Đề