I believe that a significant answer has been given to this question, but I hope this comparison will shed some light on the trade-off between pure code and time:
from timeit import timeit from random import choice A = {x:[y for y in range(100)] for x in range(1000)} def test_pop(): k, v= A.popitem() A[k] = v def test_iter(): k = next(A.iterkeys()) def test_list(): k = choice(A.keys()) def test_insert(): A[0] = 0 if __name__ == '__main__': print('pop', timeit("test_pop()", setup="from __main__ import test_pop", number=10000)) print('iter', timeit("test_iter()", setup="from __main__ import test_iter", number=10000)) print('list', timeit("test_list()", setup="from __main__ import test_list", number=10000)) print('insert', timeit("test_insert()", setup="from __main__ import test_insert", number=10000))
Here are the results:
('pop', 0.0021750926971435547) ('iter', 0.002003908157348633) ('list', 0.047267913818359375) ('insert', 0.0010859966278076172)
It seems that using iterkeys is only marginally faster than a popup and reinsert, but 10 times faster than creating a list and selecting a random object from it.
Drew Verlee Oct 18 '13 at 17:25 2013-10-18 17:25
source share