Add tuple support to more str functions

Addressed in larger benchmark:

find chars best case - 2.40x faster
2000000 loops, best of 5: 176 nsec per loop
1000000 loops, best of 5: 221 nsec per loop
1000000 loops, best of 5: 279 nsec per loop
1000000 loops, best of 5: 225 nsec per loop
5000000 loops, best of 5: 73.4 nsec per loop
find chars mixed case - 1.07x slower
2000000 loops, best of 5: 176 nsec per loop
1000000 loops, best of 5: 220 nsec per loop
1000000 loops, best of 5: 277 nsec per loop
20000 loops, best of 5: 16.2 usec per loop
2000000 loops, best of 5: 188 nsec per loop
find chars worst case - 1.09x faster
5 loops, best of 5: 42.1 msec per loop
5 loops, best of 5: 53.4 msec per loop
50 loops, best of 5: 4.32 msec per loop
10000 loops, best of 5: 32.1 usec per loop
10000 loops, best of 5: 29.5 usec per loop
find subs best case - 2.96x faster
1000000 loops, best of 5: 214 nsec per loop
1000000 loops, best of 5: 314 nsec per loop
1000000 loops, best of 5: 221 nsec per loop
5000000 loops, best of 5: 72.4 nsec per loop
find subs mixed case - 33.5x slower
1000000 loops, best of 5: 221 nsec per loop
1000000 loops, best of 5: 289 nsec per loop
500 loops, best of 5: 731 usec per loop
50000 loops, best of 5: 7.41 usec per loop
find subs worst case - no difference
5 loops, best of 5: 54.6 msec per loop
50 loops, best of 5: 5.29 msec per loop
200 loops, best of 5: 1.46 msec per loop
200 loops, best of 5: 1.47 msec per loop
find many prefixes - 82.1x slower
1 loop, best of 5: 509 msec per loop
1000 loops, best of 5: 302 usec per loop
10 loops, best of 5: 36.7 msec per loop
10 loops, best of 5: 24.8 msec per loop
find many infixes - 5.20x slower
1 loop, best of 5: 508 msec per loop
50 loops, best of 5: 4.33 msec per loop
10 loops, best of 5: 33.1 msec per loop
10 loops, best of 5: 22.5 msec per loop

rfind chars best case - 1.24x faster
2000000 loops, best of 5: 112 nsec per loop
1000000 loops, best of 5: 296 nsec per loop
50 loops, best of 5: 8.54 msec per loop
1000000 loops, best of 5: 229 nsec per loop
5000000 loops, best of 5: 90 nsec per loop
rfind chars mixed case - 54.9x slower
2000000 loops, best of 5: 112 nsec per loop
1000000 loops, best of 5: 304 nsec per loop
50 loops, best of 5: 8.52 msec per loop
500 loops, best of 5: 597 usec per loop
50000 loops, best of 5: 6.15 usec per loop
rfind chars worst case - 1.03x slower
5 loops, best of 5: 51.6 msec per loop
5 loops, best of 5: 56.2 msec per loop
10 loops, best of 5: 22.7 msec per loop
200 loops, best of 5: 1.19 msec per loop
200 loops, best of 5: 1.22 msec per loop
rfind subs best case - 2.32x faster
1000000 loops, best of 5: 358 nsec per loop
50 loops, best of 5: 8.53 msec per loop
1000000 loops, best of 5: 230 nsec per loop
5000000 loops, best of 5: 99.2 nsec per loop
rfind subs mixed case - 20.4x slower
1000000 loops, best of 5: 363 nsec per loop
50 loops, best of 5: 8.53 msec per loop
500 loops, best of 5: 724 usec per loop
50000 loops, best of 5: 7.4 usec per loop
rfind subs worst case - no difference
5 loops, best of 5: 52.3 msec per loop
10 loops, best of 5: 20.9 msec per loop
200 loops, best of 5: 1.45 msec per loop
200 loops, best of 5: 1.45 msec per loop
rfind many suffixes - 1.06x slower
1 loop, best of 5: 508 msec per loop
1 loop, best of 5: 217 msec per loop
10 loops, best of 5: 24.6 msec per loop
10 loops, best of 5: 26.1 msec per loop
rfind many infixes - no difference
1 loop, best of 5: 511 msec per loop
1 loop, best of 5: 218 msec per loop
10 loops, best of 5: 22.5 msec per loop
10 loops, best of 5: 22.4 msec per loop

That’s a bit overkill, I would rather have find_chars() than that, as it can be used by more people.


If you’re talking about the alternatives, I wouldn’t use any of them either. How do you think to speed this up? Without an implementation this claim is meaningless.


Smaller chunks don’t speed up the performance that much for early matches. There’s too much overhead for that.