2009-07-16 37 views
37

Tôi đã xem qua số this question về quản lý bộ nhớ của từ điển, đề cập đến chức năng intern. Chính xác nó sẽ làm gì và khi nào nó sẽ được sử dụng?Python sys.intern làm gì và khi nào nó nên được sử dụng?

Để đưa ra một ví dụ:

Nếu tôi có một bộ gọi là thấy, có chứa bản ghi trong biểu mẫu (string1, string2), mà tôi sử dụng để kiểm tra các bản sao, sẽ lưu trữ (thực tập sinh (string1) , intern (string2)) cải thiện hiệu suất bộ nhớ hoặc tốc độ?

Trả lời

47

Từ Python 3 tài liệu:

sys.intern(string) 

Nhập chuỗi ký tự trong bảng chuỗi “thực tập nội trú” và trả về chuỗi thực tập nội trú - đó là chuỗi bản thân hoặc một bản sao. Các chuỗi nội bộ hữu ích để đạt được hiệu suất nhỏ trong tra cứu từ điển - nếu các phím trong từ điển được tập trung, và phím tra cứu được thực tập, các so sánh chính (sau khi băm) có thể được thực hiện bằng cách so sánh thay vì chuỗi so sánh. Thông thường, các tên được sử dụng trong các chương trình Python được tự động interned và các từ điển được sử dụng để giữ các thuộc tính mô-đun, lớp hoặc cá thể có các thuộc tính mô-đun .

Chuỗi nội bộ không phải là bất tử; bạn phải giữ một tham chiếu đến giá trị trả về của thực tập() xung quanh để hưởng lợi từ nó.

Làm rõ:

Như các tài liệu cho thấy, hàm sys.intern được thiết kế để được sử dụng cho hiệu suất tối ưu hóa.

Chức năng sys.intern duy trì bảng thực tập chuỗi. Khi bạn cố gắng thực tập một chuỗi, hàm trông nó lên trong bảng và:

  1. Nếu chuỗi không tồn tại (chưa được thực tập nội trú chưa) chức năng tiết kiệm nó trong bảng và trả về nó từ bảng chuỗi nội bộ.

    >>> import sys 
    >>> a = sys.intern('why do pangolins dream of quiche') 
    >>> a 
    'why do pangolins dream of quiche' 
    

    Trong ví dụ trên, a giữ chuỗi nội bộ. Mặc dù nó không hiển thị, hàm sys.intern đã lưu đối tượng chuỗi 'why do pangolins dream of quiche' trong bảng chuỗi nội bộ.

  2. Nếu chuỗi tồn tại (đã được interned) hàm trả về từ bảng chuỗi nội bộ.

    >>> b = sys.intern('why do pangolins dream of quiche') 
    >>> b 
    'why do pangolins dream of quiche' 
    

    Mặc dù nó không phải là ngay lập tức có thể nhìn thấy, bởi vì chuỗi 'why do pangolins dream of quiche' đã được thực tập nội trú trước đây, b hiện nắm giữ đối tượng chuỗi giống như a.

    >>> b is a 
    True 
    

    Nếu chúng ta tạo cùng một chuỗi mà không sử dụng thực tập, chúng tôi kết thúc với hai đối tượng chuỗi khác nhau có cùng giá trị.

    >>> c = 'why do pangolins dream of quiche' 
    >>> c is a 
    False 
    >>> c is b 
    False 
    

Bằng cách sử dụng sys.intern bạn đảm bảo rằng bạn không bao giờ tạo ra hai đối tượng chuỗi có cùng giá trị khi bạn yêu cầu việc tạo ra một đối tượng chuỗi thứ hai với cùng một giá trị như một đối tượng chuỗi hiện có, bạn nhận được một tham chiếu đến đối tượng chuỗi đã tồn tại từ trước. Bằng cách này, bạn đang lưu bộ nhớ. Ngoài ra, so sánh các đối tượng chuỗi bây giờ là rất hiệu quả bởi vì nó được thực hiện bằng cách so sánh các địa chỉ bộ nhớ của hai đối tượng chuỗi thay vì nội dung của chúng.

+0

Nếu chúng ta viết mã trong một file '.py' và làm điều đó chúng tôi nhận' c là a' như 'True'. Tại sao vậy? –

4

Nó trả về một phiên bản chuẩn của chuỗi.

Vì vậy, nếu bạn có nhiều trường hợp chuỗi bằng nhau bạn tiết kiệm bộ nhớ, và ngoài ra bạn cũng có thể so sánh chuỗi chuẩn hóa bằng danh tính thay vì bình đẳng nhanh hơn.

17

Thực tập cơ bản tra cứu (hoặc lưu trữ nếu không có) chuỗi trong tập hợp các chuỗi nội bộ, vì vậy tất cả các cá thể thực tập sẽ chia sẻ cùng một danh tính. Bạn giao dịch chi phí một lần để tìm kiếm chuỗi này để so sánh nhanh hơn (so sánh có thể trả về True sau khi chỉ kiểm tra danh tính, thay vì phải so sánh từng ký tự) và giảm mức sử dụng bộ nhớ.

Tuy nhiên, python sẽ automatically intern strings that are small, or look like identifiers, vì vậy bạn có thể thấy bạn không có cải thiện vì các chuỗi của bạn đã bị lưu trữ sau hậu trường. Ví dụ:

>>> a = 'abc'; b = 'abc' 
>>> a is b 
True 

Trước đây, một bất lợi là các chuỗi nội bộ là vĩnh viễn. Sau khi được lưu trữ, bộ nhớ chuỗi không bao giờ được giải phóng ngay cả sau khi tất cả các tham chiếu đã bị loại bỏ. Tôi nghĩ rằng điều này không còn là trường hợp cho các phiên bản mới hơn của python mặc dù.

+1

* CPython * sẽ tự động thực hiện các chuỗi nhỏ - đó là hành vi triển khai và không được đảm bảo đúng với tất cả các triển khai (nhưng có thể là). – gsnedders

+0

CPython sẽ tự động thực hiện các chuỗi nhỏ, nhưng chỉ khi chúng là các biểu thức liên tục trong mã của bạn, không phải các chuỗi được tạo tại thời gian chạy. Xem stackoverflow.com/questions/15541404/python-string-interning. – mhsmith

-3

Ý tưởng này dường như xung quanh chúng ta trong một số ngôn ngữ, bao gồm Python, Java vv

String Interning

Các vấn đề liên quan