Python đọc địa chỉ bộ nhớ

Bạn đã bao giờ tự hỏi Python xử lý dữ liệu của bạn ở hậu trường như thế nào chưa?

Trong bài viết này, chúng ta sẽ đi sâu vào bên trong Python để hiểu cách nó xử lý việc quản lý bộ nhớ

Đến cuối bài viết này, bạn sẽ

  • Tìm hiểu thêm về điện toán cấp thấp, cụ thể là liên quan đến bộ nhớ
  • Hiểu cách Python trừu tượng hóa các hoạt động cấp thấp hơn
  • Tìm hiểu về các thuật toán quản lý bộ nhớ trong của Python

Hiểu nội bộ của Python cũng sẽ giúp bạn hiểu rõ hơn về một số hành vi của Python. Hy vọng rằng bạn cũng sẽ có được sự đánh giá cao mới về Python. Rất nhiều logic đang diễn ra đằng sau hậu trường để đảm bảo chương trình của bạn hoạt động theo cách bạn mong đợi

Tiền thưởng miễn phí. 5 Suy nghĩ về Làm chủ Python, một khóa học miễn phí dành cho các nhà phát triển Python cho bạn thấy lộ trình và tư duy mà bạn sẽ cần để đưa các kỹ năng Python của mình lên một tầm cao mới

Ký ức là một cuốn sách trống rỗng

Bạn có thể bắt đầu bằng cách coi bộ nhớ của máy tính như một cuốn sách trống dành cho truyện ngắn. Không có gì được viết trên các trang. Cuối cùng, các tác giả khác nhau sẽ xuất hiện. Mỗi tác giả muốn có một số không gian để viết câu chuyện của họ trong

Vì họ không được phép viết đè lên nhau nên họ phải cẩn thận về những trang mà họ viết. Trước khi bắt đầu viết, họ hỏi ý kiến ​​người quản lý cuốn sách. Sau đó, người quản lý quyết định vị trí trong cuốn sách mà họ được phép viết

Vì cuốn sách này ra đời đã lâu nên nhiều câu chuyện trong đó không còn phù hợp nữa. Khi không có ai đọc hoặc tham khảo những câu chuyện, chúng sẽ bị xóa để nhường chỗ cho những câu chuyện mới

Về bản chất, bộ nhớ máy tính giống như cuốn sách trống rỗng đó. Trên thực tế, người ta thường gọi các khối trang bộ nhớ liền kề có độ dài cố định, vì vậy sự tương tự này diễn ra khá tốt

Các tác giả giống như các ứng dụng hoặc quy trình khác nhau cần lưu trữ dữ liệu trong bộ nhớ. Người quản lý, người quyết định nơi các tác giả có thể viết trong cuốn sách, đóng vai trò là người quản lý bộ nhớ. Người bỏ chuyện cũ nhường chỗ cho chuyện mới là người nhặt rác

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

Quản lý bộ nhớ. Từ phần cứng đến phần mềm

Quản lý bộ nhớ là quá trình ứng dụng đọc và ghi dữ liệu. Trình quản lý bộ nhớ xác định vị trí đặt dữ liệu của ứng dụng. Vì có một đoạn bộ nhớ hữu hạn, giống như các trang trong cuốn sách tương tự của chúng tôi, người quản lý phải tìm một số không gian trống và cung cấp nó cho ứng dụng. Quá trình cung cấp bộ nhớ này thường được gọi là cấp phát bộ nhớ

Mặt khác, khi dữ liệu không còn cần thiết, nó có thể bị xóa hoặc giải phóng. Nhưng giải thoát về đâu?

Ở đâu đó trong máy tính của bạn, có một thiết bị vật lý lưu trữ dữ liệu khi bạn đang chạy các chương trình Python của mình. Mặc dù vậy, có nhiều lớp trừu tượng mà mã Python đi qua trước khi các đối tượng thực sự đến phần cứng

Một trong những lớp chính phía trên phần cứng [chẳng hạn như RAM hoặc ổ cứng] là hệ điều hành [OS]. Nó thực hiện [hoặc từ chối] yêu cầu đọc và ghi bộ nhớ

Phía trên HĐH, có các ứng dụng, một trong số đó là triển khai Python mặc định [có trong HĐH của bạn hoặc tải xuống từ python. tổ chức. ] Việc quản lý bộ nhớ cho mã Python của bạn do ứng dụng Python xử lý. Các thuật toán và cấu trúc mà ứng dụng Python sử dụng để quản lý bộ nhớ là trọng tâm của bài viết này

Triển khai Python mặc định

Việc triển khai Python mặc định, CPython, thực sự được viết bằng ngôn ngữ lập trình C

Khi tôi lần đầu tiên nghe điều này, nó đã thổi bay tâm trí của tôi. Một ngôn ngữ được viết bằng ngôn ngữ khác?. Vâng, không thực sự, nhưng loại

Ngôn ngữ Python được định nghĩa trong sách hướng dẫn tham khảo viết bằng tiếng Anh. Tuy nhiên, hướng dẫn đó không phải là tất cả những gì hữu ích của chính nó. Bạn vẫn cần một cái gì đó để diễn giải mã viết dựa trên các quy tắc trong sách hướng dẫn

Bạn cũng cần một cái gì đó để thực sự thực thi mã được giải thích trên máy tính. Việc triển khai Python mặc định đáp ứng cả hai yêu cầu đó. Nó chuyển đổi mã Python của bạn thành các hướng dẫn mà sau đó nó sẽ chạy trên một máy ảo

Ghi chú. Máy ảo giống như máy tính vật lý, nhưng chúng được triển khai trong phần mềm. Chúng thường xử lý các lệnh cơ bản tương tự như lệnh Assembly

Python là một ngôn ngữ lập trình thông dịch. Mã Python của bạn thực sự được biên dịch thành các hướng dẫn dễ đọc hơn trên máy tính được gọi là. Các hướng dẫn này được máy ảo diễn giải khi bạn chạy mã của mình

Bạn đã bao giờ xem tệp

total = sum[numbers]
1 hoặc thư mục
total = sum[numbers]
2 chưa?

Điều quan trọng cần lưu ý là có các triển khai khác ngoài CPython. IronPython biên dịch xuống để chạy trên Thời gian chạy ngôn ngữ chung của Microsoft. Jython biên dịch thành mã byte Java để chạy trên Máy ảo Java. Sau đó, có PyPy, nhưng nó xứng đáng có toàn bộ bài viết riêng, vì vậy tôi sẽ chỉ đề cập sơ qua về nó

Với mục đích của bài viết này, tôi sẽ tập trung vào việc quản lý bộ nhớ được thực hiện bằng triển khai mặc định của Python, CPython

từ chối trách nhiệm. Mặc dù nhiều thông tin này sẽ được chuyển sang các phiên bản Python mới, nhưng mọi thứ có thể thay đổi trong tương lai. Lưu ý rằng phiên bản được tham chiếu cho bài viết này là phiên bản Python mới nhất hiện tại,

total = sum[numbers]
3

Được rồi, vì vậy CPython được viết bằng C và nó diễn giải mã byte của Python. Điều này có liên quan gì đến quản lý bộ nhớ? . Để hiểu cách quản lý bộ nhớ của Python, bạn phải hiểu cơ bản về chính CPython

CPython được viết bằng C, vốn không hỗ trợ lập trình hướng đối tượng. Do đó, có khá nhiều thiết kế thú vị trong mã CPython

Bạn có thể đã nghe nói rằng mọi thứ trong Python đều là đối tượng, kể cả các loại như

total = sum[numbers]
4 và
total = sum[numbers]
5. Chà, điều đó đúng ở cấp độ triển khai trong CPython. Có một
total = sum[numbers]
6 được gọi là một
total = sum[numbers]
7, mà mọi đối tượng khác trong CPython đều sử dụng

Ghi chú. Một

total = sum[numbers]
6, hoặc cấu trúc, trong C là một kiểu dữ liệu tùy chỉnh nhóm các kiểu dữ liệu khác nhau lại với nhau. So với các ngôn ngữ hướng đối tượng, nó giống như một lớp có thuộc tính và không có phương thức

total = sum[numbers]
7, cha đẻ của tất cả các đối tượng trong Python, chỉ chứa hai thứ

  • total = sum[numbers]
    
    2. số tham chiếu
  • total = sum[numbers]
    
    3. con trỏ đến loại khác

Số tham chiếu được sử dụng để thu gom rác. Sau đó, bạn có một con trỏ tới loại đối tượng thực tế. Loại đối tượng đó chỉ là một

total = sum[numbers]
6 khác mô tả một đối tượng Python [chẳng hạn như
total = sum[numbers]
5 hoặc
total = sum[numbers]
4]

Mỗi đối tượng có bộ cấp phát bộ nhớ dành riêng cho đối tượng biết cách lấy bộ nhớ để lưu trữ đối tượng đó. Mỗi đối tượng cũng có một bộ giải phóng bộ nhớ dành riêng cho đối tượng để “giải phóng” bộ nhớ khi nó không còn cần thiết nữa

Tuy nhiên, có một yếu tố quan trọng trong toàn bộ cuộc nói chuyện này về việc cấp phát và giải phóng bộ nhớ. Bộ nhớ là tài nguyên được chia sẻ trên máy tính và điều tồi tệ có thể xảy ra nếu hai quy trình khác nhau cố gắng ghi vào cùng một vị trí tại cùng một thời điểm

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

Khóa phiên dịch toàn cầu [GIL]

GIL là một giải pháp cho vấn đề phổ biến trong việc xử lý các tài nguyên được chia sẻ, như bộ nhớ trong máy tính. Khi hai luồng cố gắng sửa đổi cùng một tài nguyên tại cùng một thời điểm, chúng có thể giẫm lên chân nhau. Kết quả cuối cùng có thể là một mớ hỗn độn khi cả hai chủ đề đều không kết thúc với những gì họ muốn

Hãy xem xét sự tương tự của cuốn sách một lần nữa. Giả sử rằng hai tác giả ngoan cố quyết định rằng đến lượt họ viết. Không chỉ vậy, cả hai cần phải viết trên cùng một trang sách cùng một lúc

Mỗi người bỏ qua nỗ lực của người kia để tạo ra một câu chuyện và bắt đầu viết trên trang. Kết quả cuối cùng là hai câu chuyện chồng lên nhau, làm cho toàn bộ trang hoàn toàn không thể đọc được

Một giải pháp cho vấn đề này là một khóa toàn cầu duy nhất trên trình thông dịch khi một luồng đang tương tác với tài nguyên được chia sẻ [trang trong sách]. Nói cách khác, tại một thời điểm chỉ có một tác giả có thể viết

GIL của Python thực hiện điều này bằng cách khóa toàn bộ trình thông dịch, nghĩa là không thể có luồng khác bước lên luồng hiện tại. Khi CPython xử lý bộ nhớ, nó sử dụng GIL để đảm bảo rằng nó hoạt động an toàn

Có những ưu và nhược điểm đối với phương pháp này và GIL được tranh luận rất nhiều trong cộng đồng Python. Để đọc thêm về GIL, tôi khuyên bạn nên xem Khóa thông dịch viên toàn cầu Python [GIL] là gì?

Thu gom rác thải

Hãy xem lại cuốn sách tương tự và giả sử rằng một số câu chuyện trong cuốn sách đã trở nên rất cũ. Không ai đọc hoặc tham khảo những câu chuyện đó nữa. Nếu không có ai đang đọc một cái gì đó hoặc tham khảo nó trong tác phẩm của họ, bạn có thể loại bỏ nó để nhường chỗ cho bài viết mới

Cách viết cũ, không tham chiếu đó có thể được so sánh với một đối tượng trong Python có số lượng tham chiếu đã giảm xuống

total = sum[numbers]
7. Hãy nhớ rằng mọi đối tượng trong Python đều có số lượng tham chiếu và con trỏ tới một loại

Số lượng tham chiếu được tăng lên vì một vài lý do khác nhau. Ví dụ: số lượng tham chiếu sẽ tăng lên nếu bạn gán nó cho một biến khác

numbers = [1, 2, 3]
# Reference count = 1
more_numbers = numbers
# Reference count = 2

Nó cũng sẽ tăng lên nếu bạn chuyển đối tượng làm đối số

total = sum[numbers]

Như một ví dụ cuối cùng, số tham chiếu sẽ tăng lên nếu bạn đưa đối tượng vào danh sách

matrix = [numbers, numbers, numbers]

Python cho phép bạn kiểm tra số lượng tham chiếu hiện tại của một đối tượng bằng mô-đun

total = sum[numbers]
8. Bạn có thể sử dụng
total = sum[numbers]
9, nhưng hãy nhớ rằng việc chuyển đối tượng sang ________ 60 sẽ làm tăng số lượng tham chiếu lên ________ 61

Trong bất kỳ trường hợp nào, nếu đối tượng vẫn được yêu cầu tồn tại trong mã của bạn, thì số lượng tham chiếu của nó lớn hơn

total = sum[numbers]
7. Khi nó giảm xuống
total = sum[numbers]
7, đối tượng có chức năng hủy phân bổ cụ thể được gọi là chức năng "giải phóng" bộ nhớ để các đối tượng khác có thể sử dụng nó

Nhưng "giải phóng" bộ nhớ nghĩa là gì và các đối tượng khác sử dụng nó như thế nào?

Quản lý bộ nhớ của CPython

Chúng ta sẽ đi sâu vào kiến ​​trúc bộ nhớ và thuật toán của CPython, vì vậy hãy chuẩn bị sẵn sàng

Như đã đề cập trước đây, có các lớp trừu tượng từ phần cứng vật lý đến CPython. Hệ điều hành [OS] tóm tắt bộ nhớ vật lý và tạo một lớp bộ nhớ ảo mà các ứng dụng [bao gồm cả Python] có thể truy cập

Trình quản lý bộ nhớ ảo dành riêng cho hệ điều hành tạo ra một đoạn bộ nhớ cho quy trình Python. Các hộp màu xám đậm hơn trong hình bên dưới hiện thuộc sở hữu của quy trình Python

Python sử dụng một phần bộ nhớ để sử dụng nội bộ và bộ nhớ phi đối tượng. Phần còn lại được dành riêng cho lưu trữ đối tượng [_______24,

total = sum[numbers]
5 của bạn, v.v.]. Lưu ý rằng điều này đã được đơn giản hóa một chút. Nếu bạn muốn có bức tranh đầy đủ, bạn có thể xem mã nguồn CPython, nơi thực hiện tất cả việc quản lý bộ nhớ này

CPython có một bộ cấp phát đối tượng chịu trách nhiệm cấp phát bộ nhớ trong vùng bộ nhớ đối tượng. Bộ cấp phát đối tượng này là nơi hầu hết các phép thuật xảy ra. Nó được gọi mỗi khi một đối tượng mới cần phân bổ hoặc xóa không gian

Thông thường, việc thêm và xóa dữ liệu cho các đối tượng Python như

matrix = [numbers, numbers, numbers]
6 và
total = sum[numbers]
4 không liên quan đến quá nhiều dữ liệu tại một thời điểm. Vì vậy, thiết kế của bộ cấp phát được điều chỉnh để hoạt động tốt với lượng dữ liệu nhỏ tại một thời điểm. Nó cũng cố gắng không cấp phát bộ nhớ cho đến khi thực sự cần thiết

Các nhận xét trong mã nguồn mô tả bộ cấp phát là “bộ cấp phát bộ nhớ nhanh, có mục đích đặc biệt cho các khối nhỏ, được sử dụng trên một malloc có mục đích chung. ” Trong trường hợp này,

matrix = [numbers, numbers, numbers]
8 là hàm thư viện của C để cấp phát bộ nhớ

Bây giờ chúng ta sẽ xem xét chiến lược cấp phát bộ nhớ của CPython. Đầu tiên, chúng ta sẽ nói về 3 phần chính và cách chúng liên quan đến nhau

Đấu trường là khối bộ nhớ lớn nhất và được căn chỉnh trên một ranh giới trang trong bộ nhớ. Ranh giới trang là cạnh của đoạn bộ nhớ liền kề có độ dài cố định mà HĐH sử dụng. Python giả sử kích thước trang của hệ thống là 256 kilobyte

Trong đấu trường là các nhóm, là một trang bộ nhớ ảo [4 kilobyte]. Đây giống như các trang trong cuốn sách tương tự của chúng tôi. Các nhóm này được phân mảnh thành các khối bộ nhớ nhỏ hơn

Tất cả các khối trong một nhóm nhất định có cùng “loại kích thước. ” Một lớp kích thước xác định kích thước khối cụ thể, với một số lượng dữ liệu được yêu cầu. Biểu đồ dưới đây được lấy trực tiếp từ các bình luận mã nguồn

Yêu cầu theo byteKích thước của lớp kích thước khối được phân bổ idx1-8809-1616117-2424225-3232333-4040441-4848549-5656657-6464765-72728………497-50450462505-51251263

Ví dụ: nếu 42 byte được yêu cầu, dữ liệu sẽ được đặt vào một khối có kích thước 48 byte

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

hồ bơi

Các nhóm bao gồm các khối từ một lớp kích thước duy nhất. Mỗi nhóm duy trì một danh sách liên kết đôi với các nhóm khác có cùng kích thước lớp. Theo cách đó, thuật toán có thể dễ dàng tìm thấy không gian có sẵn cho một kích thước khối nhất định, thậm chí trên các nhóm khác nhau

Một danh sách

matrix = [numbers, numbers, numbers]
9 theo dõi tất cả các nhóm có sẵn một số không gian cho dữ liệu cho từng loại kích thước. Khi một kích thước khối nhất định được yêu cầu, thuật toán sẽ kiểm tra danh sách
matrix = [numbers, numbers, numbers]
9 này để biết danh sách nhóm cho kích thước khối đó

Bản thân các nhóm phải ở một trong 3 trạng thái.

total = sum[numbers]
11,
total = sum[numbers]
12 hoặc
total = sum[numbers]
13. Nhóm
total = sum[numbers]
11 có sẵn các khối để lưu trữ dữ liệu. Tất cả các khối của nhóm
total = sum[numbers]
12 đều được phân bổ và chứa dữ liệu. Nhóm
total = sum[numbers]
13 không có dữ liệu được lưu trữ và có thể được chỉ định bất kỳ loại kích thước nào cho các khối khi cần

Một danh sách

total = sum[numbers]
17 theo dõi tất cả các pool ở trạng thái
total = sum[numbers]
13. Nhưng khi nào các vùng trống được sử dụng?

Giả sử mã của bạn cần một đoạn bộ nhớ 8 byte. Nếu không có nhóm nào trong

matrix = [numbers, numbers, numbers]
9 của lớp kích thước 8 byte, thì nhóm
total = sum[numbers]
13 mới được khởi tạo để lưu trữ các khối 8 byte. Nhóm mới này sau đó được thêm vào danh sách
matrix = [numbers, numbers, numbers]
9 để nó có thể được sử dụng cho các yêu cầu trong tương lai

Giả sử nhóm

total = sum[numbers]
12 giải phóng một số khối của nó vì bộ nhớ không còn cần thiết nữa. Nhóm đó sẽ được thêm trở lại danh sách
matrix = [numbers, numbers, numbers]
9 cho loại kích thước của nó

Bây giờ bạn có thể thấy cách các nhóm có thể di chuyển tự do giữa các trạng thái này [và thậm chí cả các lớp kích thước bộ nhớ] bằng thuật toán này

khối

Như đã thấy trong sơ đồ trên, các nhóm chứa một con trỏ tới các khối bộ nhớ "miễn phí" của chúng. Có một chút sắc thái trong cách thức hoạt động của nó. Bộ cấp phát này “cố gắng ở mọi cấp độ [đấu trường, nhóm và khối] không bao giờ chạm vào một phần bộ nhớ cho đến khi nó thực sự cần thiết,” theo nhận xét trong mã nguồn

Điều đó có nghĩa là một nhóm có thể có các khối ở 3 trạng thái. Các trạng thái này có thể được định nghĩa như sau

  • total = sum[numbers]
    
    24. một phần bộ nhớ chưa được cấp phát
  • total = sum[numbers]
    
    25. một phần bộ nhớ đã được cấp phát nhưng sau đó được CPython "miễn phí" và không còn chứa dữ liệu liên quan
  • total = sum[numbers]
    
    26. một phần bộ nhớ thực sự chứa dữ liệu liên quan

Con trỏ

total = sum[numbers]
27 trỏ tới một danh sách liên kết đơn gồm các khối bộ nhớ trống. Nói cách khác, một danh sách các vị trí có sẵn để đặt dữ liệu. Nếu cần nhiều hơn số khối miễn phí có sẵn, người cấp phát sẽ nhận được một số khối
total = sum[numbers]
24 trong nhóm

Vì trình quản lý bộ nhớ làm cho các khối trở nên “miễn phí”, những khối

total = sum[numbers]
25 đó hiện được thêm vào phía trước danh sách
total = sum[numbers]
27. Danh sách thực tế có thể không phải là các khối bộ nhớ liền kề, giống như sơ đồ đẹp đầu tiên. Nó có thể trông giống như sơ đồ bên dưới

đấu trường

Đấu trường chứa hồ bơi. Những nhóm đó có thể là

total = sum[numbers]
11,
total = sum[numbers]
12 hoặc
total = sum[numbers]
13. Mặc dù vậy, bản thân các đấu trường không có trạng thái rõ ràng như các nhóm

Thay vào đó, các đấu trường được tổ chức thành một danh sách liên kết đôi có tên là

total = sum[numbers]
34. Danh sách được sắp xếp theo số lượng pool miễn phí có sẵn. Càng ít bể miễn phí, đấu trường càng gần đầu danh sách

Điều này có nghĩa là đấu trường có nhiều dữ liệu nhất sẽ được chọn để đặt dữ liệu mới vào. Nhưng tại sao không phải là ngược lại?

Điều này đưa chúng ta đến ý tưởng thực sự giải phóng bộ nhớ. Bạn sẽ nhận thấy rằng tôi đã nói "miễn phí" trong dấu ngoặc kép khá nhiều. Lý do là khi một khối được coi là "miễn phí", bộ nhớ đó không thực sự được giải phóng trở lại hệ điều hành. Quy trình Python giữ cho nó được phân bổ và sẽ sử dụng nó sau này cho dữ liệu mới. Thực sự giải phóng bộ nhớ trả lại cho hệ điều hành để sử dụng

Đấu trường là thứ duy nhất có thể thực sự được giải phóng. Vì vậy, lý do là những đấu trường gần trống rỗng hơn nên được phép trở nên trống rỗng. Bằng cách đó, đoạn bộ nhớ đó có thể thực sự được giải phóng, giảm dung lượng bộ nhớ tổng thể của chương trình Python của bạn

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

Sự kết luận

Quản lý bộ nhớ là một phần không thể thiếu khi làm việc với máy tính. Python xử lý gần như tất cả ở hậu trường, tốt hơn hoặc xấu hơn

Trong bài viết này, bạn đã học

  • Quản lý bộ nhớ là gì và tại sao nó quan trọng
  • Cách triển khai Python mặc định, CPython, được viết bằng ngôn ngữ lập trình C
  • Cách các cấu trúc dữ liệu và thuật toán phối hợp với nhau trong quản lý bộ nhớ của CPython để xử lý dữ liệu của bạn

Python trừu tượng hóa rất nhiều chi tiết khó hiểu khi làm việc với máy tính. Điều này mang lại cho bạn sức mạnh để làm việc ở cấp độ cao hơn để phát triển mã của bạn mà không phải lo lắng về cách thức và vị trí tất cả các byte đó được lưu trữ

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

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Cách Python quản lý bộ 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ề Alexander VanTol

Alexander là một Pythonista cuồng nhiệt, người dành thời gian cho nhiều dự án sáng tạo khác nhau liên quan đến lập trình, âm nhạc và viết sáng tạo

» Thông tin thêm về Alexander

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

David

Joanna

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. 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

Làm cách nào để lấy giá trị từ địa chỉ bộ nhớ trong Python?

Bây giờ chúng ta có địa chỉ, chúng ta có thể lấy lại các đối tượng giá trị/python từ địa chỉ bộ nhớ bằng cách sử dụng mô-đun ctypes . trong đó, memeory_address là địa chỉ bộ nhớ của biến. value là phương thức được sử dụng để trích xuất một giá trị.

Python có thể đọc bộ nhớ không?

Mmap của Python cung cấp đầu vào và đầu ra tệp ánh xạ bộ nhớ [I/O] . Nó cho phép bạn tận dụng chức năng của hệ điều hành cấp thấp hơn để đọc các tệp như thể chúng là một chuỗi hoặc mảng lớn. Điều này có thể mang lại những cải tiến hiệu suất đáng kể trong mã yêu cầu nhiều tệp I/O.

Chủ Đề