Tại sao nên sử dụng enum thay vì dict Python?

Kiểu enum của Python là một khối xây dựng hữu ích để tạo các kiểu ngữ nghĩa và hằng số trong chương trình của bạn. Ví dụ: thay vì chuyển các chuỗi như 'BLUE' và 'GREEN' xung quanh, bạn có thể có Color. XANH và Màu. MÀU XANH LÁ. Vấn đề? . Chúng tôi đã sử dụng enum rất nhiều trong mã của mình, cho đến khi chúng tôi nhận thấy rằng chi phí enum chiếm một phần trăm thời gian CPU của chúng tôi. May mắn thay, chỉ mất vài giờ để viết một triển khai nhanh hơn nhiều với chức năng gần như tương tự. nhập dây buộc

Vài năm trước, khi fastenum ra đời, nó có lợi thế về tốc độ ~ 10 lần so với enum. Trong những năm qua, việc triển khai thư viện tiêu chuẩn đã được cải thiện rất nhiều, nhưng dây buộc vẫn còn tối đa 3. 5x nhanh hơn cho đến ngày nay

fastenum trong nhiều trường hợp sẽ hoạt động như một sự thay thế drop-in cho enum sau khi bạn cài đặt nó với pip install fastenum

import fastenum

class Color(fastenum.Enum):
    RED = 0
    BLUE = 1
    GREEN = 2

assert isinstance(Color.RED, Color)
assert Color.RED is Color['RED']
assert Color.BLUE != 1
assert Color.GREEN.value == 2

def is_red(c: Color) -> bool:
    return c is Color.RED

Tuy nhiên, truy cập thuộc tính (mọi biểu thức đơn giản như Màu. XANH DƯƠNG) là 3. Nhanh hơn gấp 5 lần trong điểm chuẩn. Chúng tôi nghĩ rằng điều này rất quan trọng vì chúng tôi thực hiện hàng triệu tra cứu thuộc tính trên enum – gần như không thể sử dụng enum nếu không có quyền truy cập thuộc tính. Đây là một điểm chuẩn so sánh fastenum với enum tiêu chuẩn (thời gian càng thấp càng tốt)

------------------------- benchmark 'test_attribute_access': 2 tests -------------------------
Name (time in ns)                       Mean              StdDev              Median
----------------------------------------------------------------------------------------------
test_attribute_access[fastenum]     127.5973 (1.0)       62.0568 (1.0)      116.2900 (1.0)
test_attribute_access[enum]         447.2529 (3.51)     885.4300 (14.27)    408.0000 (3.51)
----------------------------------------------------------------------------------------------

Các thao tác phổ biến khác là 1. 5–2. Nhanh hơn gấp 5 lần. đây là quyền truy cập 'cuộc gọi' (Color(2)), quyền truy cập 'getitem' ( Color['BLUE'] ) và phép lặp enum (đối với . ).

--------------------------- benchmark 'test_call': 2 tests ---------------------------
Name (time in ns)             Mean                StdDev              Median
--------------------------------------------------------------------------------------
test_call[fastenum]       425.0350 (1.0)        145.8800 (1.0)      401.7500 (1.0)
test_call[enum]         1,066.1683 (2.51)     1,076.5092 (7.38)     957.0000 (2.38)
--------------------------------------------------------------------------------------

------------------------- benchmark 'test_getitem_access': 2 tests -------------------------
Name (time in ns)                     Mean              StdDev              Median
--------------------------------------------------------------------------------------------
test_getitem_access[fastenum]     241.7980 (1.0)       99.1632 (1.0)      227.1364 (1.0)
test_getitem_access[enum]         606.9534 (2.51)     730.2464 (7.36)     562.0000 (2.47)
--------------------------------------------------------------------------------------------

---------------------- benchmark 'test_iter': 2 tests ----------------------
Name (time in us)         Mean            StdDev            Median
----------------------------------------------------------------------------
test_iter[fastenum]     1.5749 (1.0)      1.3203 (1.0)      1.4580 (1.0)
test_iter[enum]         2.3743 (1.51)     1.5423 (1.17)     2.2030 (1.51)
----------------------------------------------------------------------------

Chúng tôi cũng lưu trữ __hash__ và __repr__ của các thành viên enum (dễ thực hiện vì các thành viên enum không đổi). Bộ đệm __hash__ đặc biệt hữu ích, vì chúng tôi có xu hướng sử dụng enum làm khóa từ điển trong một số trường hợp

Chúng tôi cũng đã phát triển một plugin mypy cho fastenum mà bạn có thể kích hoạt trong mypy. ban đầu

[mypy]
plugins = fastenum.mypy_plugin:plugin

Điều này là cần thiết để mypy hiểu fastenum giống như cách nó hiểu enum (mà nó có hỗ trợ tích hợp sẵn). Lưu ý rằng bạn có thể gặp sự cố mypy kỳ lạ liên quan đến bộ đệm mypy khi sử dụng plugin này. Đó là một lỗi đáng tiếc mà chúng tôi chưa theo dõi. Nếu bạn gặp phải nó, thật không may, cần phải tắt bộ đệm mypy bằng cách đặt cache_dir = /dev/null 🤦‍♂️

Chúng tôi đã làm như thế nào và sự đánh đổi là gì

fastenum ra đời như một thử nghiệm đơn giản khi tôi thực hiện triển khai enum ban đầu và bắt đầu xóa các tính năng, đơn giản hóa và lưu vào bộ nhớ đệm những gì còn lại. Điều này hoạt động tốt một cách đáng ngạc nhiên - chúng tôi đã tăng tốc gấp 10 lần khi ra khỏi cổng. (Lợi thế này giảm dần xuống còn 3. 5x khi hiệu suất enum tiêu chuẩn trở nên tốt hơn. ) Các đồng nghiệp tuyệt vời của tôi sau đó đã tiếp tục cải tiến dây buộc trong nhiều năm và quan trọng nhất là làm cho nó tương thích với mypy (chúng tôi yêu thích mypy ở Quantlane)

fastenum là một chiếc xe đua đơn giản bên cạnh chiếc sedan enum thoải mái của bạn. Không có hỗ trợ cho các giá trị tự động, kiểm tra giá trị duy nhất, bí danh, triển khai __init__ tùy chỉnh trên các thành viên, IntEnum, Flag hoặc API chức năng. Nếu bạn yêu cầu bất kỳ tính năng nào trong số này, tốt nhất bạn chỉ nên sử dụng enum. Điều đó nói rằng, chúng tôi sẵn lòng chấp nhận các yêu cầu kéo với các tính năng như vậy, miễn là chúng không ảnh hưởng đến hiệu suất của dây buộc cơ sở

Lấy nó ở đâu

fastenum là mã nguồn mở theo Giấy phép Apache 2. 0 và được thử nghiệm để hoạt động với Python 3. 7 và 3. 8. Nó có sẵn trên PyPI với một fastenum cài đặt pip đơn giản và mã nguồn có trên GitLab của chúng tôi

Tại sao sử dụng enum thay vì từ điển?

Tóm lược. enums dùng để liệt kê t$$anonymous$$ngs để bạn có thể sử dụng để xác định chúng sau này. Từ điển được sử dụng để lưu trữ các giá trị (đối tượng hoặc biến) dựa trên khóa

Tại sao nên sử dụng enum thay vì String Python?

Kiểu enum của Python là một khối xây dựng hữu ích để tạo các kiểu ngữ nghĩa và hằng số trong chương trình của bạn . Ví dụ: thay vì chuyển các chuỗi như 'BLUE' và 'GREEN' xung quanh, bạn có thể có Color. XANH và Màu. MÀU XANH LÁ.

Python enum dùng để làm gì?

Python enum rất hữu ích để biểu thị dữ liệu đại diện cho một tập hợp trạng thái hữu hạn chẳng hạn như ngày trong tuần, tháng trong năm, v.v. Chúng đã được thêm vào Python 3. 4 qua PEP 435. Tuy nhiên, nó có sẵn tất cả các cách trở lại 2. 4 qua pypy. Như vậy, bạn có thể mong đợi chúng trở thành một yếu tố chính khi bạn khám phá lập trình Python.

Khi nào chúng ta nên sử dụng enum?

Bạn phải luôn sử dụng enums khi một biến (đặc biệt là tham số phương thức) chỉ có thể lấy một giá trị trong một tập hợp nhỏ các giá trị có thể. Ví dụ sẽ là những thứ như hằng số loại (trạng thái hợp đồng. "vĩnh viễn", "tạm thời", "tập sự") hoặc cờ ("thực hiện ngay", "hoãn thực hiện")