前の質問に関連して: Python3 split() with generator .
ジェネレーターまたはイテレーターを使用してリストを分割する方法はありますが、正規表現を作成するよりも効率的ですか?
「.split()」は正規表現で実装されていないと思います。
同等のものを見たいのですが、メモリに分割されたリスト全体を作成するのではなく、ジェネレーターまたはイテレーターを使用して「オンザフライ」で作成します。
前の質問に関連して: Python3 split() with generator .
ジェネレーターまたはイテレーターを使用してリストを分割する方法はありますが、正規表現を作成するよりも効率的ですか?
「.split()」は正規表現で実装されていないと思います。
同等のものを見たいのですが、メモリに分割されたリスト全体を作成するのではなく、ジェネレーターまたはイテレーターを使用して「オンザフライ」で作成します。
これは正規表現よりも少し速いようです:
def itersplit2(s, sep):
i = 0
l = len(sep)
j = s.find(sep, i)
while j > -1:
yield s[i:j]
i = j + l
j = s.find(sep, i)
else:
yield s[i:]
しかし、それよりも 10倍遅いstr.split
None とは異なるセパレーターのバージョンは次のとおりです。
def iter_split(s, sep):
start = 0
L = len(s)
lsep = len(sep)
assert lsep > 0
while start < L:
end = s.find(sep, start)
if end != -1:
yield s[start:end]
start = end + lsep
if start == L:
yield '' # sep found but nothing after
else:
yield s[start:] # the last element
start = L # to quit the loop
十分なテストを行っていないため、バグが含まれている可能性があります。と比較した結果str.split()
:
sep = '<>'
s = '1<>2<>3'
print('--------------', repr(s), repr(sep))
print(s.split(sep))
print(list(iter_split(s, sep)))
s = '<>1<>2<>3<>'
print('--------------', repr(s), repr(sep))
print(s.split(sep))
print(list(iter_split(s, sep)))
sep = ' '
s = '1 2 3'
print('--------------', repr(s), repr(sep))
print(s.split(sep))
print(list(iter_split(s, sep)))
s = '1 2 3'
print('--------------', repr(s), repr(sep))
print(s.split(sep))
print(list(iter_split(s, sep)))
以下が表示されます。
-------------- '1<>2<>3' '<>'
['1', '2', '3']
['1', '2', '3']
-------------- '<>1<>2<>3<>' '<>'
['', '1', '2', '3', '']
['', '1', '2', '3', '']
-------------- '1 2 3' ' '
['1', '2', '3']
['1', '2', '3']
-------------- '1 2 3' ' '
['1', '', '', '2', '', '', '3']
['1', '', '', '2', '', '', '3']
より多くのルールがあるため、デフォルトのNone
セパレーターの実装はより複雑になります。
とにかく、プリコンパイルされた正規表現は非常に効率的です。それらは、作成時にエラーが発生しやすくなりますが、準備が整うと高速になります。