=============================== RESTART: Shell ===============================
>>> import time
>>> from contextlib import contextmanager
>>> @contextmanager
def get_time():
start = time.time()
yield
end = time.time()
print(end-start)
>>> l = [['id0', 'pyt'], ['id0', 'hon'], ['id1', 'aiu'], ['id1', 'eo']]
>>> l = l * 10000
>>>
>>> from collections import defaultdict
>>>
>>> d = defaultdict(str)
>>> with get_time():
for k,v in l: d[k] += v
0.04916644096374512
>>>
>>> d = defaultdict(list)
>>> with get_time():
for k,v in l: d[k].append(v)
0.011052608489990234
>>>
>>> from itertools import groupby
>>> with get_time():
d = [(k, ''.join([item[1] for item in i])) for k,i in groupby(l, key=lambda x:x[0])]
0.01807713508605957
>>>
>>> with get_time():
d = {id:[i[1] for i in l if i[0]==id] for id in dict(l).keys()}
0.005514621734619141
>>>
>>>
=============================== RESTART: Shell ===============================
>>> l = [['id0', 'pyt'], ['id0', 'hon'], ['id1', 'aiu'], ['id1', 'eo']]
>>> for k,v in {id:[i[1] for i in l if i[0]==id] for id in dict(l).keys()}.items(): print(k, ''.join(v))
id0 python
id1 aiueo
>>>
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSRVNUQVJUOiBTaGVsbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cj4+PiBpbXBvcnQgdGltZQo+Pj4gZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgo+Pj4gQGNvbnRleHRtYW5hZ2VyCmRlZiBnZXRfdGltZSgpOgoJc3RhcnQgPSB0aW1lLnRpbWUoKQoJeWllbGQKCWVuZCA9IHRpbWUudGltZSgpCglwcmludChlbmQtc3RhcnQpCgoJCj4+PiBsID0gW1snaWQwJywgJ3B5dCddLCBbJ2lkMCcsICdob24nXSwgWydpZDEnLCAnYWl1J10sIFsnaWQxJywgJ2VvJ11dCj4+PiBsID0gbCAqIDEwMDAwCj4+PiAKPj4+IGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0Cj4+PiAKPj4+IGQgPSBkZWZhdWx0ZGljdChzdHIpCj4+PiB3aXRoIGdldF90aW1lKCk6Cglmb3Igayx2IGluIGw6IGRba10gKz0gdgoKCQowLjA0OTE2NjQ0MDk2Mzc0NTEyCj4+PiAKPj4+IGQgPSBkZWZhdWx0ZGljdChsaXN0KQo+Pj4gd2l0aCBnZXRfdGltZSgpOgoJZm9yIGssdiBpbiBsOiBkW2tdLmFwcGVuZCh2KQoKCQowLjAxMTA1MjYwODQ4OTk5MDIzNAo+Pj4gCj4+PiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgZ3JvdXBieQo+Pj4gd2l0aCBnZXRfdGltZSgpOgoJZCA9IFsoaywgJycuam9pbihbaXRlbVsxXSBmb3IgaXRlbSBpbiBpXSkpIGZvciBrLGkgaW4gZ3JvdXBieShsLCBrZXk9bGFtYmRhIHg6eFswXSldCgoJCjAuMDE4MDc3MTM1MDg2MDU5NTcKPj4+IAo+Pj4gd2l0aCBnZXRfdGltZSgpOgoJZCA9IHtpZDpbaVsxXSBmb3IgaSBpbiBsIGlmIGlbMF09PWlkXSBmb3IgaWQgaW4gZGljdChsKS5rZXlzKCl9CgoJCjAuMDA1NTE0NjIxNzM0NjE5MTQxCj4+PiAKPj4+IAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJFU1RBUlQ6IFNoZWxsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KPj4+IGwgPSBbWydpZDAnLCAncHl0J10sIFsnaWQwJywgJ2hvbiddLCBbJ2lkMScsICdhaXUnXSwgWydpZDEnLCAnZW8nXV0KPj4+IGZvciBrLHYgaW4ge2lkOltpWzFdIGZvciBpIGluIGwgaWYgaVswXT09aWRdIGZvciBpZCBpbiBkaWN0KGwpLmtleXMoKX0uaXRlbXMoKTogcHJpbnQoaywgJycuam9pbih2KSkKCmlkMCBweXRob24KaWQxIGFpdWVvCj4+PiA=