Vì vậy, tôi đã chơi với list
các đồ vật và tìm thấy một điều kỳ lạ rằng nếu list
được tạo ra với list()
nó sẽ sử dụng nhiều bộ nhớ hơn là khả năng hiểu danh sách? Tôi đang sử dụng Python 3.5.2
In [1]: import sys
In [2]: a = list(range(100))
In [3]: sys.getsizeof(a)
Out[3]: 1008
In [4]: b = [i for i in range(100)]
In [5]: sys.getsizeof(b)
Out[5]: 912
In [6]: type(a) == type(b)
Out[6]: True
In [7]: a == b
Out[7]: True
In [8]: sys.getsizeof(list(b))
Out[8]: 1008
Từ các tài liệu :
Danh sách có thể được xây dựng theo một số cách:
- Sử dụng một cặp dấu ngoặc vuông để biểu thị danh sách trống:
[]
- Sử dụng dấu ngoặc vuông, tách mục có dấu phẩy:
[a]
,[a, b, c]
- Sử dụng khả năng hiểu danh sách:
[x for x in iterable]
- Sử dụng hàm tạo kiểu:
list()
hoặclist(iterable)
Nhưng có vẻ như sử dụng list()
nó sử dụng nhiều bộ nhớ hơn.
Và càng list
lớn, khoảng cách càng tăng.
Tại sao điều này xảy ra?
CẬP NHẬT # 1
Kiểm tra với Python 3.6.0b2:
Python 3.6.0b2 (default, Oct 11 2016, 11:52:53)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getsizeof(list(range(100)))
1008
>>> sys.getsizeof([i for i in range(100)])
912
CẬP NHẬT # 2
Kiểm tra với Python 2.7.12:
Python 2.7.12 (default, Jul 1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getsizeof(list(xrange(100)))
1016
>>> sys.getsizeof([i for i in xrange(100)])
920
sys.getsizeof(list(range(100)))
là 1016,getsizeof(range(100))
là 872 vàgetsizeof([i for i in range(100)])
là 920. Tất cả đều có kiểulist
.