Helpex - Trao đổi & giúp đỡ Đăng nhập

operator.itemgetter hoặc lambda

Ngô Ngọc Tâm
· 20:16 21/06/2013
19 giờ trước

Tôi rất tò mò nếu có bất kỳ dấu hiệu nào về việc sử dụng từ khóa nào operator.itemgetter(0)hoặc lambda x:x[0]tốt hơn, cụ thể sorted()là trong keyđối số từ khóa vì đó là cách sử dụng mà tôi nghĩ đến đầu tiên. Có bất kỳ sự khác biệt nào về hiệu suất đã biết không? Có bất kỳ ưu đãi hoặc hướng dẫn nào liên quan đến PEP về vấn đề này không?

33 hữu ích 4 bình luận 8.1k xem chia sẻ
Ngô Hữu Phước
· 07:13 18/12/2018
07:13:49 18/12/2018

Theo điểm chuẩn của tôi trên danh sách 1000 bộ giá trị, việc sử dụng itemgettergần như nhanh hơn gấp đôi so với lambdaphương pháp đơn giản . Sau đây là mã của tôi:

In [1]: a = list(range(1000))

In [2]: b = list(range(1000))

In [3]: import random

In [4]: random.shuffle(a)

In [5]: random.shuffle(b)

In [6]: c = list(zip(a, b))

In [7]: %timeit c.sort(key=lambda x: x[1])
81.4 µs ± 433 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [8]: random.shuffle(c)

In [9]: from operator import itemgetter

In [10]: %timeit c.sort(key=itemgetter(1))
47 µs ± 202 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Tôi cũng đã kiểm tra hiệu suất (thời gian chạy tính bằng µs) của hai phương pháp này cho các kích thước danh sách khác nhau.

+-----------+--------+------------+
| List size | lambda | itemgetter |
+-----------+--------+------------+
| 100       | 8.19   | 5.09       |
+-----------+--------+------------+
| 1000      | 81.4   | 47         |
+-----------+--------+------------+
| 10000     | 855    | 498        |
+-----------+--------+------------+
| 100000    | 14600  | 10100      |
+-----------+--------+------------+
| 1000000   | 172000 | 131000     |
+-----------+--------+------------+

operator.itemgetter hoặc lambda

(Mã sản xuất hình ảnh trên có thể được tìm thấy ở đây )

Kết hợp với sự ngắn gọn để chọn nhiều phần tử từ một danh sách, itemgetterrõ ràng là phần tử chiến thắng để sử dụng trong phương pháp sắp xếp.

10 hữu ích 0 bình luận chia sẻ
Dương Thanh Vy
· 20:22 21/06/2013
20:22:55 21/06/2013

Hiệu suất của itemgetter tốt hơn một chút:

>>> f1 = lambda: sorted(w, key=lambda x: x[1])
>>> f2 = lambda: sorted(w, key=itemgetter(1))
>>> timeit(f1)
21.33667682500527
>>> timeit(f2)
16.99106214600033
39 hữu ích 3 bình luận chia sẻ
Phi  Phí
· 20:22 21/06/2013
20:22:39 21/06/2013

Bỏ qua vấn đề tốc độ, thường dựa vào nơi bạn tạo itemgetter hoặc hàm lambda, cá nhân tôi thấy rằng điều đó itemgetterthực sự tốt khi nhận được nhiều mục cùng một lúc: ví dụ: itemgetter(0, 4, 3, 9, 19, 20)sẽ tạo một hàm trả về một loạt các mục tại các chỉ số được chỉ định của đối tượng dạng danh sách được chuyển đến nó. Để làm điều đó với lambda, bạn cần lambda x:x[0], x[4], x[3], x[9], x[19], x[20], điều này phức tạp hơn rất nhiều. (Và sau đó một số gói, chẳng hạn như numpycó lập chỉ mục nâng cao, hoạt động rất giống itemgetter()ngoại trừ được tích hợp trong ký hiệu dấu ngoặc bình thường.)

17 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python python-2.7 python-3.x , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm