他にできることはあまりありませんが、すでに述語がある場合
def crit(x):
return x > 0
できるよ
sum(map(crit, a))
また
len(filter(crit, a))
len([x for x in a if x > 0])
が最も効率的ですが、述語を再利用する場合はコードの重複につながる可能性があります。
テスト:
In [6]: %timeit len([x for x in a if x > 0])
100000 loops, best of 3: 3.57 us per loop
In [7]: def crit(x):
...: return x > 0
...:
In [8]: %timeit len([x for x in a if crit(x)])
100000 loops, best of 3: 10.1 us per loop
In [9]: %timeit sum([x > 0 for x in a])
100000 loops, best of 3: 5.66 us per loop
In [10]: %timeit sum([crit(x) for x in a])
100000 loops, best of 3: 12 us per loop
In [11]: %timeit sum(map(crit, a))
100000 loops, best of 3: 11.3 us per loop
In [12]: %timeit len(filter(crit, a))
100000 loops, best of 3: 8.21 us per loop
ジェネレーター(ジェネレーターにはありませんlen
):
In [13]: %timeit sum(1 for x in a if x > 0)
100000 loops, best of 3: 3.99 us per loop
In [14]: %timeit sum([1 for x in a if crit(x)])
10000 loops, best of 3: 10.6 us per loop
In [15]: %timeit sum(x > 0 for x in a)
100000 loops, best of 3: 6.24 us per loop
In [16]: %timeit sum(crit(x) for x in a)
100000 loops, best of 3: 13 us per loop
imap
よりも速いmap
:
In [17]: %timeit sum(itertools.imap(crit, a))
100000 loops, best of 3: 10.7 us per loop
これらすべてをテストした後、私は[13]、[17]、または[14]で行くと思います。