[英]Fastest way to count list values below a threshold
是否有等效于numpy.count_nonzero(lst <t)的列表方法? 当我在列表(lst <t)上使用它时,只返回True而不是布尔值列表。 我想将列表值计算在某个阈值以下,哪个更好-转换为numpy-array,使用sort,某种类型的列表/生成器理解或其他方法?
不建议排序,因为它是O(N * logN),其中所有其他解决方案都只是O(N)。
您可以使用生成器表达式和generator-len函数,如下所示:
n = iterlen( x for x in lst if x < t )
这比列表理解要好,因为您不需要构造临时列表(使用len即可),这会占用时间和内存。
根据问题的详细信息(列表大小,元素类型),转换为numpy数组的速度可能会更快。 您应该对两种方法都进行计时,然后看看哪种方法最适合您。
当然,如果可能的话,最好的解决方案是将列表表示为开始的numpy数组。 如果这样做,几乎可以确定numpy.count_nonzero(lst < t)
是最快的。
或者,如果您可以count_less
开始建立排序列表,则可以使用bisect
轻松实现count_less
函数。 这里的复杂度是O(logN),对于大型列表而言这将是最快的。
c将是列表(lst)中低于值t的所有项目的计数:
c = len([i for i in lst if i < t])
您可以为此使用基数包:
用法:
>>> import cardinality
>>> cardinality.count(i for i in range(500) if i > 499)
1
实际的count()实现如下:
def count(iterable):
if hasattr(iterable, '__len__'):
return len(iterable)
d = collections.deque(enumerate(iterable, 1), maxlen=1)
return d[0][0] if d else 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.