繁体   English   中英

计算低于阈值的列表值的最快方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM