STINNER Victor added the comment: msg264009: Serhiy Storchaka "Could you compare filter(), map() and sorted() performance with your patch and with issue23507 patch?"
Here you have the result of bench_builtins.py. The performance look to be the same, even if I expect better performance with less trivial callbacks (where fastcall would avoid the creation of other temporary tuples). ------------------------------------------------+-------------+-------------- Tests | argtuples | fastcall ------------------------------------------------+-------------+-------------- filter(lambda x: x, range(1000)) | 80.2 us (*) | 72.7 us (-9%) map(lambda x: x, range(1000)) | 79.5 us (*) | 79.9 us map(lambda x, y: x+y, range(1000), range(1000)) | 111 us (*) | 109 us sorted(list, key=lambda x: x) | 82.6 us (*) | 75.7 us (-8%) sorted(list) | 15.7 us (*) | 15.6 us ------------------------------------------------+-------------+-------------- Total | 369 us (*) | 353 us ------------------------------------------------+-------------+-------------- Comparison to the original Python 3.6: ------------------------------------------------+-------------+----------------+--------------- Tests | original | argtuples | fastcall ------------------------------------------------+-------------+----------------+--------------- filter(lambda x: x, range(1000)) | 109 us (*) | 80.2 us (-27%) | 72.7 us (-33%) map(lambda x: x, range(1000)) | 96.9 us (*) | 79.5 us (-18%) | 79.9 us (-18%) map(lambda x, y: x+y, range(1000), range(1000)) | 126 us (*) | 111 us (-12%) | 109 us (-13%) sorted(list, key=lambda x: x) | 114 us (*) | 82.6 us (-28%) | 75.7 us (-34%) sorted(list) | 16.1 us (*) | 15.7 us | 15.6 us ------------------------------------------------+-------------+----------------+--------------- Total | 463 us (*) | 369 us (-20%) | 353 us (-24%) ------------------------------------------------+-------------+----------------+--------------- The difference is more on the changes in bltinmodule.c. Example with filter_next(): Using fastcall: - good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); + good = PyObject_CallArg1(lz->func, item); reuse_argtuples_2.patch: - good = PyObject_CallFunctionObjArgs(lz->func, - item, NULL); + PyObject *argtuple = lz->argtuple; + lz->argtuple = NULL; + if (argtuple == NULL) { + argtuple = PyTuple_New(1); + if (argtuple == NULL) { + Py_DECREF(item); + return NULL; + } + Py_INCREF(argtuple); + } + assert(Py_REFCNT(argtuple) == 2); + assert(Py_SIZE(argtuple) == 1); + assert(PyTuple_GET_ITEM(argtuple, 0) == NULL); + PyTuple_SET_ITEM(argtuple, 0, item); + good = PyObject_Call(lz->func, argtuple, NULL); + if (Py_REFCNT(argtuple) == 2) { + PyTuple_SET_ITEM(argtuple, 0, NULL); + if (lz->argtuple == NULL) + lz->argtuple = argtuple; + else { + Py_DECREF(argtuple); + Py_DECREF(argtuple); + } + } + else { + Py_INCREF(item); + Py_DECREF(argtuple); + Py_DECREF(argtuple); + } (reuse_argtuples_2.patch requires a few other changes related to filter_next().) ---------- Added file: http://bugs.python.org/file42569/bench_builtins.py _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue23507> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com