Message264012
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().) |
|
Date |
User |
Action |
Args |
2016-04-22 13:54:27 | vstinner | set | recipients:
+ vstinner, rhettinger, pitrou, scoder, ezio.melotti, serhiy.storchaka |
2016-04-22 13:54:27 | vstinner | set | messageid: <1461333267.43.0.831513138751.issue23507@psf.upfronthosting.co.za> |
2016-04-22 13:54:27 | vstinner | link | issue23507 messages |
2016-04-22 13:54:27 | vstinner | create | |
|