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

Python 计数低于阈值的列表值的最快方法,python,performance,list,count,Python,Performance,List,Count,是否有列表方法等效于numpy.count\u非零(lst

是否有列表方法等效于numpy.count\u非零(lst有什么更好的方法-转换为numpy数组,使用排序、某种列表/生成器理解或其他方法?

不建议使用排序,因为它是O(N*logN),其中所有其他解决方案都是O(N)

可以使用生成器表达式和函数,如下所示:

n = iterlen( x for x in lst if x < t )
n=iterlen(如果x
这比列表理解更好,因为你不需要构建临时列表(你使用len),它会占用时间和内存

根据问题的细节(列表大小、元素类型),转换为numpy数组可能会更快。你应该对两种方法都计时,看看哪一种最适合你

当然,如果可能的话,最好的解决方案是首先将列表表示为numpy数组。如果这样做,
numpy.count\u nonzero(lst
几乎肯定是最快的


或者,如果您可以首先构建一个排序列表,那么您可以使用实现一个
count\u less
函数。这里的复杂度是O(logN),这对于大型列表来说是最快的。

c将是列表(lst)中低于t值的所有项目的计数:

c = len([i for i in lst if i < t])
c=len(如果i
您可以使用此软件包:

用法:

>>> 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

如果
lst
是4GB怎么办?然后按照另一个人的答案去做。我甚至投了赞成票。顺便说一句,这仍然适用于4场演出;只会慢一点。