Python:计算if条件列表中元素的数量

K. *_*yah 5 python

给定一个整数列表,计算一定范围内有多少元素的Pythonic /最佳方法是什么?

我研究并找到了两种方法:

>>> x = [10, 60, 20, 66, 79, 5]
>>> len([i for i in x if 60 < i < 70])
1
Run Code Online (Sandbox Code Playgroud)

要么:

>>> x = [10, 60, 20, 66, 79, 5]
>>> sum(1 for i in x if 60 < i < 70)
1
Run Code Online (Sandbox Code Playgroud)

哪种方法使用较少的时间/内存(对于较大的列表)以及为什么?或者也许另一种方式更好......

Ami*_*ory 6

在您提出的具体实例中

[i for i in x if 60 < i < 70]
Run Code Online (Sandbox Code Playgroud)

实际上生成一个全新的列表,然后获取它的len. 反过来,

(1 for i in x if 60 < i < 70)
Run Code Online (Sandbox Code Playgroud)

是一个生成器表达式,您可以对其进行sum.

对于足够大的相关项目,第二个版本将更有效(特别是在内存方面)。


时间安排

x = [65] * 9999999

%%time

len([i for i in x if 60 < i < 70])

CPU times: user 724 ms, sys: 44 ms, total: 768 ms
Wall time: 768 ms
Out[7]:
9999999

%%time

sum(1 for i in x if 60 < i < 70)
CPU times: user 592 ms, sys: 0 ns, total: 592 ms
Wall time: 593 ms
Run Code Online (Sandbox Code Playgroud)


tim*_*geb 5

生成器表达式更内存效率更高,因为您不必创建额外的列表。

\n\n

创建一个列表并获取它的长度(后者是一个非常快的 O(1) 操作)似乎更快比创建一个生成器并对相对较小的列表进行 n 次添加

\n\n
In [13]: x = [1]\nIn [14]: timeit len([i for i in x if 60 < i < 70])\n10000000 loops, best of 3: 141 ns per loop\nIn [15]: timeit sum(1 for i in x if 60 < i < 70)\n1000000 loops, best of 3: 355 ns per loop\nIn [16]: x = range(10)\nIn [17]: timeit len([i for i in x if 60 < i < 70])\n1000000 loops, best of 3: 564 ns per loop\nIn [18]: timeit sum(1 for i in x if 60 < i < 70)\n1000000 loops, best of 3: 781 ns per loop\nIn [19]: x = range(50)\nIn [20]: timeit len([i for i in x if 60 < i < 70])\n100000 loops, best of 3: 2.4 \xc2\xb5s per loop\nIn [21]: timeit sum(1 for i in x if 60 < i < 70)\n100000 loops, best of 3: 2.62 \xc2\xb5s per loop\nIn [22]: x = range(1000)\nIn [23]: timeit len([i for i in x if 60 < i < 70])\n10000 loops, best of 3: 50.9 \xc2\xb5s per loop\nIn [24]: timeit sum(1 for i in x if 60 < i < 70)\n10000 loops, best of 3: 51.7 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

例如,我尝试了各种列表[65]*n但趋势没有改变。例如:

\n\n
In [1]: x = [65]*1000\nIn [2]: timeit len([i for i in x if 60 < i < 70])\n10000 loops, best of 3: 67.3 \xc2\xb5s per loop\nIn [3]: timeit sum(1 for i in x if 60 < i < 70)\n10000 loops, best of 3: 82.3 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n