Message 415127 - Python tracker (original) (raw)
The attached _PyList_AppendTakeRef.diff has the ceval.c, but this implementation:
int _PyList_AppendTakeRef(PyListObject *self, PyObject *newitem) { assert(self != NULL && newitem != NULL); assert(PyList_Check(self)); Py_ssize_t len = PyList_GET_SIZE(self); Py_ssize_t allocated = self->allocated; assert((size_t)len + 1 < PY_SSIZE_T_MAX); if (allocated > len) { PyList_SET_ITEM(self, len, newitem); Py_SET_SIZE(self, len + 1); return 0; } if (list_resize(self, len + 1) < 0) { Py_DECREF(newitem); return -1; } PyList_SET_ITEM(self, len, newitem); return 0; }
Results:
Benchmark | main | PR 31864 | _PyList_AppendTakeRef.diff |
---|---|---|---|
listcomp 100 | 1.61 us | 1.33 us: 1.21x faster | 1.55 us: 1.04x faster |
append 100 | 2.11 us | 1.82 us: 1.15x faster | 2.05 us: 1.03x faster |
listcomp 1000 | 12.6 us | 9.83 us: 1.28x faster | 11.9 us: 1.06x faster |
append 1000 | 18.1 us | 15.3 us: 1.18x faster | 17.6 us: 1.03x faster |
listcomp 10000 | 121 us | 93.2 us: 1.29x faster | 114 us: 1.06x faster |
append 10000 | 175 us | 150 us: 1.17x faster | 172 us: 1.02x faster |
listcomp 100000 | 1.17 ms | 923 us: 1.26x faster | 1.15 ms: 1.02x faster |
append 100000 | 1.70 ms | 1.49 ms: 1.14x faster | not significant |
Geometric mean | (ref) | 1.21x faster | 1.03x faster |