Commit 3511d1a
committed
str: take search bounds through the character index
find, rfind, index, rindex, count, startswith and endswith resolved their
start/stop bounds with AnyStr::get_chars, which walks the payload to both
bounds, and find reported its hit by counting the code points in front of
it -- so a sweep over a subject's own indices walked it once per call.
Slice the bounds with PyStr::char_index_to_byte instead, and map the hit
back with Wtf8Index::char_index_at_byte, added here as the table's inverse:
a bracketed search over the groups, then at most an entry's worth of steps.
The payload alone does not say whether it is ASCII, so get_chars walked
there too; that path is now off it as well.
n=8000, sweeping the bound over the subject, best of 3, interleaved:
'가나다라'*n/4 'abcd'*n/4
find 17.72ms -> 0.16ms 3.48ms -> 0.11ms
startswith 17.60ms -> 0.09ms
count 22.54ms -> 3.72ms
count stays linear in the range it is given, as it is in CPython.
Assisted-by: Claude1 parent e9b6510 commit 3511d1a
4 files changed
Lines changed: 146 additions & 33 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
405 | 405 | | |
406 | 406 | | |
407 | 407 | | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
408 | 427 | | |
409 | 428 | | |
410 | 429 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
104 | 104 | | |
105 | 105 | | |
106 | 106 | | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
107 | 164 | | |
108 | 165 | | |
109 | 166 | | |
| |||
153 | 210 | | |
154 | 211 | | |
155 | 212 | | |
156 | | - | |
| 213 | + | |
| 214 | + | |
157 | 215 | | |
158 | 216 | | |
159 | 217 | | |
160 | 218 | | |
161 | 219 | | |
162 | | - | |
| 220 | + | |
| 221 | + | |
163 | 222 | | |
164 | 223 | | |
165 | 224 | | |
166 | 225 | | |
167 | | - | |
168 | | - | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
169 | 232 | | |
170 | 233 | | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
171 | 241 | | |
172 | 242 | | |
173 | 243 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
147 | 147 | | |
148 | 148 | | |
149 | 149 | | |
150 | | - | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
151 | 155 | | |
152 | 156 | | |
153 | 157 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
| 12 | + | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| |||
719 | 719 | | |
720 | 720 | | |
721 | 721 | | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
722 | 729 | | |
723 | 730 | | |
724 | 731 | | |
| |||
924 | 931 | | |
925 | 932 | | |
926 | 933 | | |
927 | | - | |
928 | | - | |
929 | | - | |
930 | | - | |
931 | | - | |
| 934 | + | |
| 935 | + | |
| 936 | + | |
| 937 | + | |
| 938 | + | |
| 939 | + | |
932 | 940 | | |
933 | 941 | | |
934 | 942 | | |
| |||
944 | 952 | | |
945 | 953 | | |
946 | 954 | | |
947 | | - | |
948 | | - | |
949 | | - | |
950 | | - | |
951 | | - | |
| 955 | + | |
| 956 | + | |
| 957 | + | |
| 958 | + | |
| 959 | + | |
| 960 | + | |
952 | 961 | | |
953 | 962 | | |
954 | 963 | | |
| |||
1167 | 1176 | | |
1168 | 1177 | | |
1169 | 1178 | | |
1170 | | - | |
| 1179 | + | |
| 1180 | + | |
| 1181 | + | |
| 1182 | + | |
1171 | 1183 | | |
1172 | | - | |
1173 | | - | |
| 1184 | + | |
| 1185 | + | |
| 1186 | + | |
| 1187 | + | |
| 1188 | + | |
| 1189 | + | |
| 1190 | + | |
1174 | 1191 | | |
1175 | 1192 | | |
| 1193 | + | |
| 1194 | + | |
1176 | 1195 | | |
1177 | 1196 | | |
1178 | 1197 | | |
1179 | 1198 | | |
1180 | 1199 | | |
1181 | 1200 | | |
1182 | | - | |
| 1201 | + | |
| 1202 | + | |
| 1203 | + | |
1183 | 1204 | | |
1184 | 1205 | | |
1185 | 1206 | | |
1186 | 1207 | | |
1187 | | - | |
1188 | | - | |
| 1208 | + | |
1189 | 1209 | | |
1190 | 1210 | | |
1191 | 1211 | | |
1192 | 1212 | | |
1193 | | - | |
1194 | | - | |
| 1213 | + | |
1195 | 1214 | | |
1196 | 1215 | | |
1197 | 1216 | | |
1198 | 1217 | | |
1199 | | - | |
| 1218 | + | |
1200 | 1219 | | |
1201 | 1220 | | |
1202 | 1221 | | |
1203 | 1222 | | |
1204 | 1223 | | |
1205 | | - | |
| 1224 | + | |
1206 | 1225 | | |
1207 | 1226 | | |
1208 | 1227 | | |
| |||
1275 | 1294 | | |
1276 | 1295 | | |
1277 | 1296 | | |
1278 | | - | |
1279 | | - | |
| 1297 | + | |
| 1298 | + | |
| 1299 | + | |
1280 | 1300 | | |
1281 | | - | |
1282 | | - | |
1283 | | - | |
1284 | | - | |
| 1301 | + | |
| 1302 | + | |
| 1303 | + | |
| 1304 | + | |
1285 | 1305 | | |
1286 | | - | |
| 1306 | + | |
1287 | 1307 | | |
1288 | 1308 | | |
1289 | 1309 | | |
| |||
0 commit comments