2013-02-19 37 views
14

Gọi del trên một biến trong Python. Liệu bộ nhớ được cấp phát miễn phí này ngay lập tức hay vẫn đang chờ bộ thu gom rác thu thập? Giống như trong java, gọi một cách rõ ràng del không có tác dụng khi bộ nhớ sẽ được giải phóng.Tuyên bố lệnh delphi

+0

Các điểm thu gom rác thải là bạn không cần phải lo lắng về việc khi nhớ được giải phóng . Vậy tại sao bạn lo lắng về nó? –

+0

Tôi đang xử lý khối lượng lớn lưu lượng truy cập và các sự cố rò rỉ bộ nhớ được quan sát. Tôi gần như chắc chắn vấn đề không phải là trong kịch bản python, nhưng chỉ cố gắng để đảm bảo. – ninja

Trả lời

18

Câu lệnh del không đòi lại bộ nhớ. Nó loại bỏ một tham chiếu, làm giảm số lượng tham chiếu trên giá trị. Nếu số đếm bằng không, bộ nhớ có thể được khai hoang. CPython sẽ lấy lại bộ nhớ ngay lập tức, không cần phải chờ bộ thu gom rác chạy.

Thực tế, bộ thu gom rác chỉ cần thiết để thu hồi các cấu trúc tuần hoàn.

Như Waleed Khan nói trong bình luận của mình, quản lý bộ nhớ Python hoạt động, bạn không phải lo lắng về điều đó.

+1

Tôi không tin rằng CPython sẽ giải phóng bộ nhớ cho hệ điều hành, ngay cả sau khi nó được khai hoang. – martineau

+0

Vì vậy, khi bạn nói "Nếu số đếm là không, bộ nhớ có thể được khai hoang.", Bạn có nghĩa là nó vẫn cần phải đợi cho bộ thu gom rác được "thực sự" khai hoang hay không? – ninja

+2

Tôi không chắc chắn làm thế nào để nói nó: "CPython sẽ lấy lại bộ nhớ ngay lập tức, không cần phải đợi cho bộ thu gom rác chạy." –

2

"Xóa tên sẽ xóa liên kết của tên đó khỏi không gian tên cục bộ hoặc toàn cục". Không nhiều không ít. Nó không làm gì với đối tượng mà tên được trỏ đến, ngoại trừ việc giảm số lần truy cập của nó và nếu refcount không bằng 0 thì đối tượng sẽ không được thu thập ngay cả khi GC chạy.

1

Ngoài ra, del tuyên bố có vẻ là nhanh hơn một chút so với gán Không (tương tự như phong cách của Java gán vô cho một biến để giải phóng bộ nhớ của nó ...).

Để so sánh:

import time, math 

def measure_del(): 
     start = time.time() 
     for i in range(0,int(math.pow(10,8))): 
        a = "123" 
        del a # <--- !!! 
     end = time.time() 
     print(end-start) 

def measure_none(): 
     start = time.time() 
     for i in range(0,int(math.pow(10,8))): 
        a = "123" 
        a = None # <--- !!! 
     end = time.time() 
     print(end-start) 

kết quả trong (chạy trong idle3.4):

>>> measure_del() 
3.9930295944213867 
>>> measure_del() 
3.7402305603027344 
>>> measure_del() 
3.8423104286193848 
>>> measure_del() 
3.753770351409912 
>>> measure_del() 
3.7772741317749023 
>>> measure_del() 
3.815058946609497 

>>> measure_none() 
4.052351236343384 
>>> measure_none() 
4.130320072174072 
>>> measure_none() 
4.082390069961548 
>>> measure_none() 
4.100180625915527 
>>> measure_none() 
4.071730375289917 
>>> measure_none() 
4.136169672
+0

Tại sao các lập trình viên lại bị cuốn hút bởi tốc độ của những thứ không tạo nên sự khác biệt nào với tốc độ tổng thể của chương trình? :) –

+0

Vâng, nó giống như một gói giấy. Ví dụ. bạn có thể mua 500 tờ với dung lượng 80g/m² hoặc 90g/m². Nếu bạn viết trên một tờ đơn, bạn sẽ khó nhận thấy sự khác biệt. Nhưng nếu bạn so sánh cả hai gói, bạn sẽ thấy sự khác biệt rõ ràng về chiều cao, trọng lượng và giá cả. Viết mã tốt, chắc chắn không phải là một ý tưởng tồi để cân bằng khả năng đọc của mã với hiệu năng ở cấp độ máy. – Barpfotenbaer