INADA Naoki added the comment: Only patch which affects to hot loop is:
--- a/Objects/dictobject.c Tue Nov 15 21:21:35 2016 -0500 +++ b/Objects/dictobject.c Wed Nov 16 11:40:51 2016 +0000 @@ -1550,11 +1550,18 @@ PyDict_MergeFromSeq2(PyObject *d, PyObje /* Update/merge with this (key, value) pair. */ key = PySequence_Fast_GET_ITEM(fast, 0); value = PySequence_Fast_GET_ITEM(fast, 1); + Py_INCREF(key); + Py_INCREF(value); if (override || PyDict_GetItem(d, key) == NULL) { int status = PyDict_SetItem(d, key, value); - if (status < 0) + if (status < 0) { + Py_DECREF(key); + Py_DECREF(value); goto Fail; + } } + Py_DECREF(key); + Py_DECREF(value); Py_DECREF(fast); Py_DECREF(item); } Microbenchmark for it: $ ~/local/py35/bin/master -m perf timeit --rigorous -t --python ~/local/py35/bin/patched --compare-to ~/local/py35/bin/master -s 'L = [(i,i) for i in range(10000)]' -- 'dict.fromkeys(L)' Benchmark master ================ .........................................Total duration: 21.2 sec Start date: 2016-11-17 12:21:39 End date: 2016-11-17 12:22:13 Raw sample minimum: 109 ms Raw sample maximum: 144 ms Number of runs: 41 Total number of samples: 120 Number of samples per run: 3 Number of warmups per run: 1 Loop iterations per sample: 32 Minimum: 3.41 ms (-13%) Median +- std dev: 3.92 ms +- 0.19 ms Mean +- std dev: 3.92 ms +- 0.19 ms Maximum: 4.50 ms (+15%) Median +- std dev: 3.92 ms +- 0.19 ms Benchmark patched ================= .........................................Total duration: 21.3 sec Start date: 2016-11-17 12:22:13 End date: 2016-11-17 12:22:47 Raw sample minimum: 108 ms Raw sample maximum: 152 ms Number of runs: 41 Total number of samples: 120 Number of samples per run: 3 Number of warmups per run: 1 Loop iterations per sample: 32 Minimum: 3.39 ms (-14%) Median +- std dev: 3.92 ms +- 0.23 ms Mean +- std dev: 3.95 ms +- 0.23 ms Maximum: 4.74 ms (+21%) Median +- std dev: 3.92 ms +- 0.23 ms Compare ======= Median +- std dev: [master] 3.92 ms +- 0.19 ms -> [patched] 3.92 ms +- 0.23 ms: 1.00x slower Not significant! ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue27945> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com