Lặp lại so với không gian , việc sử dụng có thể là một vấn đề. Trong các tình huống khác nhau, hồ sơ có thể hiển thị hoặc là "nhanh hơn" và / hoặc "ít bộ nhớ" hơn.
# first
>>> L = [0, 23, 234, 89, None, 0, 35, 9, ...]
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9, ...]
# second
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> for i in range(L.count(None)): L.remove(None)
[0, 23, 234, 89, 0, 35, 9, ...]
Cách tiếp cận đầu tiên (cũng được đề xuất bởi @jamylak , @Raymond Hettinger và @Dipto ) tạo ra một danh sách trùng lặp trong bộ nhớ, có thể tốn kém cho một danh sách lớn với một vài None
mục.
Cách tiếp cận thứ hai đi qua danh sách một lần, và sau đó một lần nữa cho đến khi None
đạt được a. Điều này có thể ít bộ nhớ hơn và danh sách sẽ nhỏ hơn khi nó đi. Việc giảm kích thước danh sách có thể tăng tốc cho rất nhiều None
mục ở phía trước, nhưng trường hợp xấu nhất sẽ xảy ra nếu có nhiều None
mục ở phía sau.
Các kỹ thuật song song và tại chỗ là các cách tiếp cận khác, nhưng mỗi phương pháp đều có các biến chứng riêng trong Python. Biết dữ liệu và các trường hợp sử dụng thời gian chạy, cũng như cấu hình chương trình là nơi bắt đầu cho các hoạt động chuyên sâu hoặc dữ liệu lớn.
Chọn một trong hai cách tiếp cận có thể sẽ không quan trọng trong các tình huống phổ biến. Nó trở thành một ưu tiên của ký hiệu. Trong thực tế, trong những trường hợp không phổ biến đó, numpy
hoặc cython
có thể là những lựa chọn thay thế đáng giá thay vì cố gắng tối ưu hóa vi mô Python.
filter
Phiên bản kém thanh lịch hơn :filter(lambda x: x is not None, L)
- Bạn có thể thoát khỏi việclambda
sử dụngpartial
vàoperator.is_not
tôi nghĩ, nhưng có lẽ nó không có giá trị vì danh sách comp là sạch hơn rất nhiều.