Iteration vs Space,使用可能是个问题。在不同的情况下,分析可能会显示为“更快”和/或“更少内存”密集型。
# 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, ...]
first 方法(也由@jamylak、@Raymond Hettinger 和@Dipto 建议)在内存中创建一个重复列表,这对于包含很少内容的大型列表可能会占用大量内存None 条目。
second 方法遍历列表一次,然后每次都遍历一次,直到到达None。这可能会占用更少的内存,并且列表会随着时间的推移而变得更小。列表大小的减少可能会加快前面的大量 None 条目,但最坏的情况是如果后面有大量 None 条目。
第二种方法可能总是比第一种方法慢。这并不意味着它是一个无效的考虑。
并行化和就地技术是其他方法,但它们在 Python 中都有各自的复杂性。了解数据和运行时用例以及分析程序是密集操作或大数据的起点。
在常见情况下,选择任何一种方法都可能无关紧要。它变得更像是一种符号偏好。事实上,在那些不常见的情况下,numpy(例如,如果 L 是 numpy.array:L = L[L != numpy.array(None) (from here))或cython 可能是值得的替代方案,而不是尝试对 Python 优化进行微观管理。