The common case for bisect calls is to have two positional arguments and no keyword arguments. For this case, PyArg_ParseTupleAndKeywords() is unnecessarily expensive. Timings ------- $ pytime -r 11 -s 'from bisect import bisect' -s 'arr=list(range(5))' 'bisect(arr, 2)' 2000000 loops, best of 11: 152 nsec per loop $ pytime -r 11 -s 'from bisect import bisect' -s 'arr=list(range(5))' 'bisect(arr, 2)' 2000000 loops, best of 11: 152 nsec per loop $ pytime -r 11 -s 'from bisect import bisect' -s 'arr=list(range(5))' 'bisect(arr, 2)' 2000000 loops, best of 11: 152 nsec per loop ------- patched -------- $ pytime -r 11 -s 'from bisect import bisect' -s 'arr=list(range(5))' 'bisect(arr, 2)' 2000000 loops, best of 11: 112 nsec per loop $ pytime -r 11 -s 'from bisect import bisect' -s 'arr=list(range(5))' 'bisect(arr, 2)' 2000000 loops, best of 11: 113 nsec per loop $ pytime -r 11 -s 'from bisect import bisect' -s 'arr=list(range(5))' 'bisect(arr, 2)' 2000000 loops, best of 11: 113 nsec per loop