给定一个整数列表,计算一定范围内有多少元素的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)
哪种方法使用较少的时间/内存(对于较大的列表)以及为什么?或者也许另一种方式更好......
在您提出的具体实例中
[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)
生成器表达式更内存效率更高,因为您不必创建额外的列表。
\n\n创建一个列表并获取它的长度(后者是一个非常快的 O(1) 操作)似乎更快比创建一个生成器并对相对较小的列表进行 n 次添加
\n\nIn [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\nRun Code Online (Sandbox Code Playgroud)\n\n例如,我尝试了各种列表[65]*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\nRun Code Online (Sandbox Code Playgroud)\n