Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd12e5e2

Browse files
committed
[mypyc] Optimize str.rsplit
1 parent1ec3f44 commitd12e5e2

File tree

6 files changed

+41
-1
lines changed

6 files changed

+41
-1
lines changed

‎mypyc/doc/str_operations.rst‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ Methods
3434
* ``s.join(x: Iterable)``
3535
* ``s.replace(old: str, new: str)``
3636
* ``s.replace(old: str, new: str, count: int)``
37+
* ``s.rsplit()``
38+
* ``s.rsplit(sep: str)``
39+
* ``s.rsplit(sep: str, maxsplit: int)``
3740
* ``s.split()``
3841
* ``s.split(sep: str)``
3942
* ``s.split(sep: str, maxsplit: int)``

‎mypyc/lib-rt/CPy.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,7 @@ static inline char CPyDict_CheckSize(PyObject *dict, CPyTagged size) {
721721
PyObject*CPyStr_Build(Py_ssize_tlen, ...);
722722
PyObject*CPyStr_GetItem(PyObject*str,CPyTaggedindex);
723723
PyObject*CPyStr_Split(PyObject*str,PyObject*sep,CPyTaggedmax_split);
724+
PyObject*CPyStr_RSplit(PyObject*str,PyObject*sep,CPyTaggedmax_split);
724725
PyObject*CPyStr_Replace(PyObject*str,PyObject*old_substr,PyObject*new_substr,CPyTaggedmax_replace);
725726
PyObject*CPyStr_Append(PyObject*o1,PyObject*o2);
726727
PyObject*CPyStr_GetSlice(PyObject*obj,CPyTaggedstart,CPyTaggedend);

‎mypyc/lib-rt/str_ops.c‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,15 @@ PyObject *CPyStr_Split(PyObject *str, PyObject *sep, CPyTagged max_split) {
142142
returnPyUnicode_Split(str,sep,temp_max_split);
143143
}
144144

145+
PyObject*CPyStr_RSplit(PyObject*str,PyObject*sep,CPyTaggedmax_split) {
146+
Py_ssize_ttemp_max_split=CPyTagged_AsSsize_t(max_split);
147+
if (temp_max_split==-1&&PyErr_Occurred()) {
148+
PyErr_SetString(PyExc_OverflowError,CPYTHON_LARGE_INT_ERRMSG);
149+
returnNULL;
150+
}
151+
returnPyUnicode_RSplit(str,sep,temp_max_split);
152+
}
153+
145154
PyObject*CPyStr_Replace(PyObject*str,PyObject*old_substr,
146155
PyObject*new_substr,CPyTaggedmax_replace) {
147156
Py_ssize_ttemp_max_replace=CPyTagged_AsSsize_t(max_replace);

‎mypyc/primitives/str_ops.py‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
# str.split(...)
122122
str_split_types:list[RType]= [str_rprimitive,str_rprimitive,int_rprimitive]
123123
str_split_functions= ["PyUnicode_Split","PyUnicode_Split","CPyStr_Split"]
124+
str_rsplit_functions= ["PyUnicode_RSplit","PyUnicode_RSplit","CPyStr_RSplit"]
124125
str_split_constants:list[list[tuple[int,RType]]]= [
125126
[(0,pointer_rprimitive), (-1,c_int_rprimitive)],
126127
[(-1,c_int_rprimitive)],
@@ -135,6 +136,14 @@
135136
extra_int_constants=str_split_constants[i],
136137
error_kind=ERR_MAGIC,
137138
)
139+
method_op(
140+
name="rsplit",
141+
arg_types=str_split_types[0 :i+1],
142+
return_type=list_rprimitive,
143+
c_function_name=str_rsplit_functions[i],
144+
extra_int_constants=str_split_constants[i],
145+
error_kind=ERR_MAGIC,
146+
)
138147

139148
# str.replace(old, new)
140149
method_op(

‎mypyc/test-data/fixtures/ir.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ def __getitem__(self, i: int) -> str: pass
102102
def__getitem__(self,i:slice)->str:pass
103103
def__contains__(self,item:str)->bool:pass
104104
def__iter__(self)->Iterator[str]: ...
105-
defsplit(self,sep:Optional[str]=None,max:Optional[int]=None)->List[str]:pass
105+
defsplit(self,sep:Optional[str]=None,maxsplit:int= ...)->List[str]:pass
106+
defrsplit(self,sep:Optional[str]=None,maxsplit:int= ...)->List[str]:pass
106107
defstrip (self,item:str)->str:pass
107108
defjoin(self,x:Iterable[str])->str:pass
108109
defformat(self,*args:Any,**kwargs:Any)->str: ...

‎mypyc/test-data/run-strings.test‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ def do_split(s: str, sep: Optional[str] = None, max_split: Optional[int] = None)
5555
return s.split(sep)
5656
return s.split()
5757

58+
def do_rsplit(s: str, sep: Optional[str] = None, max_split: Optional[int] = None) -> List[str]:
59+
if sep is not None:
60+
if max_split is not None:
61+
return s.rsplit(sep, max_split)
62+
else:
63+
return s.rsplit(sep)
64+
return s.rsplit()
65+
5866
ss = "abc abcd abcde abcdef"
5967

6068
def test_split() -> None:
@@ -66,6 +74,15 @@ def test_split() -> None:
6674
assert do_split(ss, " ", 1) == ["abc", "abcd abcde abcdef"]
6775
assert do_split(ss, " ", 2) == ["abc", "abcd", "abcde abcdef"]
6876

77+
def test_rsplit() -> None:
78+
assert do_rsplit(ss) == ["abc", "abcd", "abcde", "abcdef"]
79+
assert do_rsplit(ss, " ") == ["abc", "abcd", "abcde", "abcdef"]
80+
assert do_rsplit(ss, "-") == ["abc abcd abcde abcdef"]
81+
assert do_rsplit(ss, " ", -1) == ["abc", "abcd", "abcde", "abcdef"]
82+
assert do_rsplit(ss, " ", 0) == ["abc abcd abcde abcdef"]
83+
assert do_rsplit(ss, " ", 1) == ["abc abcd abcde", "abcdef"] # different to do_split
84+
assert do_rsplit(ss, " ", 2) == ["abc abcd", "abcde", "abcdef"] # different to do_split
85+
6986
def getitem(s: str, index: int) -> str:
7087
return s[index]
7188

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp