Evgimport timeit
from operator import itemgetter
from itertools import groupby
#####################################################################################
setup = """from operator import itemgetter
from itertools import groupby
from __main__ import lst
"""
lst = [{'name': 'a', 'value': 3}, {'name': 'b', 'value': 3}, {'name': 'a', 'value': 4}]
def main():
t1 = timeit.Timer("dict((i['name'], i) for i in lst).values()", setup=setup)
t2 = timeit.Timer('list(v.next() for i,v in (groupby(sorted(lst,'\
'key=itemgetter("name")), key=itemgetter("name"))))', setup=setup)
t3 = timeit.Timer('list(v.next() for i,v in (groupby(sorted(lst,'\
'key=lambda x: x["name"]), key=lambda x: x["name"])))', setup=setup)
print(t1.timeit(100000))
print(t2.timeit(100000))
print(t3.timeit(100000))
if "__main__" == __name__:
main()
0.569244694507
1.78762719843
2.08700323644
результат говорит сам за себя :)
первый вариант к тому же, более читабелен
ЗЫ. тоже самое, но без list()
def main():
t1 = timeit.Timer("dict((i['name'], i) for i in lst).values()", setup=setup)
t2 = timeit.Timer('[v.next() for i,v in (groupby(sorted(lst,'\
'key=itemgetter("name")), key=itemgetter("name")))]', setup=setup)
t3 = timeit.Timer('[v.next() for i,v in (groupby(sorted(lst,'\
'key=lambda x: x["name"]), key=lambda x: x["name"]))]', setup=setup)
print(t1.timeit(100000))
print(t2.timeit(100000))
print(t3.timeit(100000))
0.58534422671
1.07169710117
1.28886408747
чуть быстрее, но общей картины не меняет