0

前の質問に関連して: Python3 split() with generator .

ジェネレーターまたはイテレーターを使用してリストを分割する方法はありますが、正規表現を作成するよりも効率的ですか?

「.split()」は正規表現で実装されていないと思います。

同等のものを見たいのですが、メモリに分割されたリスト全体を作成するのではなく、ジェネレーターまたはイテレーターを使用して「オンザフライ」で作成します。

4

2 に答える 2

1

これは正規表現よりも少し速いようです:

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

于 2012-05-25T20:17:30.360 に答える
0

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セパレーターの実装はより複雑になります。

とにかく、プリコンパイルされた正規表現は非常に効率的です。それらは、作成時にエラーが発生しやすくなりますが、準備が整うと高速になります。

于 2012-05-25T20:11:15.567 に答える