我已經張貼reduce()
方法的好奇心,但由於答案被接受,我張貼的timeit
結果,比較此票上其他答案的表現。
from timeit import timeit
import functools
def _reduce_py2(the_list):
return reduce(lambda l, src: l.append(src['entry']['Name']) or l, the_list, [])
def _reduce_py3(the_list):
return functools.reduce(lambda l, src: l.append(src['entry']['Name']) or l, the_list, [])
def _map_py2(the_list):
return map(lambda d: d['entry']['Name'], the_list)
def _map_py3(the_list):
return [i for i in map(lambda d: d['entry']['Name'], the_list)]
def _list(the_list):
return [d['entry']['Name'] for d in the_list]
the_list = []
for i in range(1000):
the_list += [{'entry' : {'Name' : 'Smith%s' % i, 'Age' : i}}]
reps = 1000
# Compare timings
print('Reduce: ', timeit('c(the_list)', 'from __main__ import _reduce_py2 as c, the_list', number=reps))
print('Map: ', timeit('c(the_list)', 'from __main__ import _map_py2 as c, the_list', number=reps))
print('List comprehension: ', timeit('c(the_list)', 'from __main__ import _list as c, the_list', number=reps))
結果:
Py 2
Reduce: 0.2090609073638916
Map: 0.136185884475708
List comprehension: 0.07403087615966797
Py 3
Reduce: 0.20160907896934077
Map: 0.17127344600157812
List comprehension: 0.06799810699885711
結論,list comprehension
是最快的方法。不過,python 3上的map
返回了一個生成器。
你說你不想爲了性能的原因使用for-loop或list的理解,因爲你的數據有「數以百萬計」的條目。幾百萬 - 1,10,100?如果答案是100萬,那麼我的基本臺式機上的迭代大約需要0.13秒。如果你的答案是1000萬或1億,我建議你完全需要一個不同的策略 - 一個是數據不一定保存在內存中,另一個是存儲數據的方式,以便你的主要查詢可以快速得到回答。 – FMc