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
Trả lời
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 đó.
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
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
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." –
"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.
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
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? :) –
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
- 1. Tuyên bố, tuyên bố, tuyên bố
- 2. Tuyên bố trường hợp Delphi cho các dãy số nguyên
- 3. IF Tuyên bố nhiều điều kiện, cùng một tuyên bố
- 4. Tuyên bố Sql - goto
- 5. List.AddRange tuyên bố nội tuyến
- 6. DBNull nếu tuyên bố
- 7. Tuyên bố biến trong câu lệnh chuyển đổi C#
- 8. Tuyên bố chuyển đổi Java
- 9. Tuyên bố chuyển đổi JavaScript
- 10. Tuyên bố "CALLBACK" trong C làm gì?
- 11. Tuyên bố trường hợp Bash
- 12. JavaScript: IIF như tuyên bố
- 13. WPF DialogResult tuyên bố?
- 14. Tuyên bố GTK
- 15. Bootstrap Function Tuyên bố
- 16. Tuyên bố chèn Mysqli
- 17. C# Tuyên bố rỗng
- 18. awk HOẶC tuyên bố
- 19. Tuyên bố biến Python
- 20. Biểu/Tuyên Bố
- 21. Jinja2 Nếu tuyên bố
- 22. Tuyên bố Khóa C#
- 23. ORACLE IIF Tuyên Bố
- 24. mysql IF Tuyên bố khác
- 25. Các do-while tuyên bố
- 26. Nơi nhập khẩu tuyên bố
- 27. Objective-C Chuyển Tuyên Bố
- 28. switch() sử dụng tuyên bố
- 29. Tuyên bố so với tuyên bố đã chuẩn bị về mặt biên dịch
- 30. Tuyên bố ngầm của luaL_openlibs
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ó? –
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