Chuỗi nào được lưu trữ dưới dạng 16 bit trong Python?
Kể từ Python 3, loại 1 sử dụng biểu diễn Unicode. Các chuỗi Unicode có thể chiếm tới 4 byte cho mỗi ký tự tùy thuộc vào mã hóa, điều này đôi khi có thể tốn kém từ góc độ bộ nhớ Show Để giảm mức tiêu thụ bộ nhớ và cải thiện hiệu suất, Python sử dụng ba loại biểu diễn bên trong cho chuỗi Unicode
Khi lập trình bằng Python, tất cả các chuỗi hoạt động giống nhau và hầu hết thời gian chúng tôi không nhận thấy bất kỳ sự khác biệt nào. Tuy nhiên, sự khác biệt có thể rất đáng chú ý và đôi khi bất ngờ khi làm việc với lượng lớn văn bản Để thấy sự khác biệt trong các biểu diễn bên trong, chúng ta có thể sử dụng hàm 2, trả về kích thước của một đối tượng theo byte
Như bạn có thể thấy, tùy thuộc vào nội dung của một chuỗi, Python sử dụng các cách mã hóa khác nhau. Lưu ý rằng mỗi chuỗi trong Python chiếm thêm 49-80 byte bộ nhớ, nơi nó lưu trữ thông tin bổ sung, chẳng hạn như hàm băm, độ dài, độ dài tính bằng byte, loại mã hóa và cờ chuỗi. Đó là lý do tại sao một chuỗi trống chiếm 49 byte bộ nhớ Chúng tôi có thể truy xuất mã hóa trực tiếp từ một đối tượng bằng cách sử dụng 3
Nếu tất cả các ký tự trong một chuỗi có thể vừa với phạm vi ASCII, thì chúng được mã hóa bằng mã hóa Latin-1 1 byte. Về cơ bản, Latin-1 đại diện cho 256 ký tự Unicode đầu tiên. Nó hỗ trợ nhiều ngôn ngữ Latinh, chẳng hạn như tiếng Anh, tiếng Thụy Điển, tiếng Ý, tiếng Na Uy, v.v. Tuy nhiên, nó không thể lưu trữ các ngôn ngữ không phải là tiếng Latinh, chẳng hạn như tiếng Trung, tiếng Nhật, tiếng Do Thái, tiếng Cyrillic. Đó là do các điểm mã của chúng (chỉ mục số) được xác định bên ngoài phạm vi 1 byte (0-255)
Hầu hết các ngôn ngữ tự nhiên phổ biến đều có thể phù hợp với mã hóa 2 byte (UCS-2). Mã hóa 4 byte (UCS-4) được sử dụng khi một chuỗi chứa các ký hiệu đặc biệt, biểu tượng cảm xúc hoặc ngôn ngữ hiếm. Có gần 300 khối (phạm vi) trong tiêu chuẩn Unicode. Bạn có thể tìm thấy các khối 4 byte sau khối 0xFFFF Giả sử chúng ta có 10GB văn bản ASCII và chúng ta muốn tải nó vào bộ nhớ. Nếu bạn chèn một biểu tượng cảm xúc vào văn bản của chúng tôi, kích thước của chuỗi sẽ tăng lên gấp 4 lần. Đây là một sự khác biệt rất lớn mà bạn có thể gặp phải trong thực tế khi làm việc với các vấn đề NLP Tại sao Python không sử dụng mã hóa UTF-8 trong nội bộMã hóa Unicode phổ biến và nổi tiếng nhất là UTF-8, nhưng Python không sử dụng nó trong nội bộ Khi một chuỗi được lưu trữ trong mã hóa UTF-8, mỗi ký tự được mã hóa bằng 1-4 byte tùy thuộc vào ký tự mà nó đại diện. Đó là một mã hóa lưu trữ hiệu quả, nhưng nó có một nhược điểm đáng kể. Vì mỗi ký tự có thể khác nhau về độ dài byte, nên không có cách nào để truy cập ngẫu nhiên một ký tự riêng lẻ theo chỉ mục mà không quét chuỗi. Vì vậy, để thực hiện một thao tác đơn giản như 0 với UTF-8, Python sẽ cần quét một chuỗi cho đến khi tìm thấy ký tự bắt buộc. Mã hóa độ dài cố định không gặp vấn đề như vậy, để xác định vị trí ký tự theo chỉ mục Python chỉ cần nhân số chỉ mục với độ dài của một ký tự (1, 2 hoặc 4 byte)thực tập chuỗiKhi làm việc với chuỗi trống hoặc chuỗi ASCII có một ký tự, Python sử dụng chuỗi thực tập. Các chuỗi được lồng vào hoạt động như các chuỗi đơn lẻ, nghĩa là, nếu bạn có hai chuỗi giống hệt nhau được lồng vào, thì chỉ có một bản sao của chúng trong bộ nhớ
Như bạn có thể thấy, cả hai lát chuỗi đều trỏ đến cùng một địa chỉ trong bộ nhớ. Có thể vì chuỗi Python là bất biến Trong Python, việc thực tập chuỗi không giới hạn ở các ký tự hoặc chuỗi rỗng. Các chuỗi được tạo trong quá trình biên dịch mã cũng có thể được thực hiện nếu độ dài của chúng không vượt quá 20 ký tự Điêu nay bao gôm
Khi bạn nhấn enter trong Python REPL, câu lệnh của bạn sẽ được biên dịch thành mã byte. Đó là lý do tại sao tất cả các chuỗi ngắn trong REPL cũng được thực tập
Ví dụ này sẽ không hoạt động, bởi vì các chuỗi như vậy không phải là hằng số
Kỹ thuật thực tập chuỗi giúp tiết kiệm hàng chục nghìn phân bổ chuỗi trùng lặp. Trong nội bộ, việc thực tập chuỗi được duy trì bởi một từ điển toàn cầu nơi các chuỗi được sử dụng làm khóa. Để kiểm tra xem đã có một chuỗi giống hệt nhau trong bộ nhớ Python thực hiện thao tác thành viên từ điển Đối tượng unicode gần 16 000 dòng code C nên còn rất nhiều tối ưu nhỏ không đề cập trong bài viết này. Nếu bạn muốn tìm hiểu thêm về Unicode trong Python, tôi khuyên bạn nên đọc PEP về chuỗi và kiểm tra mã của đối tượng unicode Bài đăng phổ biến trong danh mục Python07 Tháng Mười, 2017Thu gom rác bằng Python. Những điều bạn cần biết28 Tháng Chín, 2017Quản lý bộ nhớ trong Python09 Tháng Năm, 2018Trích xuất văn bản từ HTML bằng Python. một cách tiếp cận rất nhanh21 Tháng Giêng, 2018Hiểu nội bộ của các lớp Python03 Tháng Tư, 2018Thủ thuật tối ưu hóa trong Python. danh sách và bộ dữ liệu29 Tháng mười hai, 2017Cấu trúc dữ liệu thưa thớt trong Pythonpython , nội bộ cpython, bộ nhớ Chia sẻ Bình luận
|