从Python字符串中删除第一行和最后一行的最快方法

jam*_*ang 10 python string performance

我有一个python脚本,由于各种原因,它有一个相当大的字符串变量,比如10mb长.该字符串包含多行.

删除此字符串的第一行和最后一行的最快方法是什么?由于弦的大小,操作越快越好; 强调速度.程序返回一个稍小的字符串,没有第一行和最后一行.

'\n'.join(string_variable[-1].split('\n')[1:-1]) 这是最简单的方法,但它非常慢,因为split()函数将对象复制到内存中,join()再次复制它.

示例字符串:

*** START OF DATA ***
data
data
data
*** END OF DATA ***
Run Code Online (Sandbox Code Playgroud)

额外信用:如果中间没有数据,此程序不会阻塞; 这是可选的,因为对于我的情况,不应该有一个中间没有数据的字符串.

Ash*_*ary 10

首先拆分,'\n'然后检查最后一个索引处的字符串是否包含'\n',如果是str.rsplit,则'\n'立即选择该项并在第0个索引处选择该项,否则返回一个空字符串:

def solve(s):
    s = s.split('\n', 1)[-1]
    if s.find('\n') == -1:
        return ''
    return s.rsplit('\n', 1)[0]
... 
>>> s = '''*** START OF DATA ***
data
data
data
*** END OF DATA ***'''
>>> solve(s)
'data\ndata\ndata'
>>> s = '''*** START OF DATA ***
*** END OF DATA ***'''
>>> solve(s)
''
>>> s = '\n'.join(['a'*100]*10**5)
>>> %timeit solve(s)
100 loops, best of 3: 4.49 ms per loop
Run Code Online (Sandbox Code Playgroud)

或者根本不拆分,'\n'从任一端找到索引并切割字符串:

>>> def solve_fast(s):
    ind1 = s.find('\n')
    ind2 = s.rfind('\n')
    return s[ind1+1:ind2]
... 
>>> s = '''*** START OF DATA ***
data
data
data
*** END OF DATA ***'''
>>> solve_fast(s)
'data\ndata\ndata'
>>> s = '''*** START OF DATA ***
*** END OF DATA ***'''
>>> solve_fast(s)
''
>>> s = '\n'.join(['a'*100]*10**5)
>>> %timeit solve_fast(s)
100 loops, best of 3: 2.65 ms per loop
Run Code Online (Sandbox Code Playgroud)


小智 8

考虑一个字符串s,它是这样的:

s = "line1\nline2\nline3\nline4\nline5"
Run Code Online (Sandbox Code Playgroud)

以下代码......

s[s.find('\n')+1:s.rfind('\n')]
Run Code Online (Sandbox Code Playgroud)

...产生输出:

'line2\nline3\nline4'
Run Code Online (Sandbox Code Playgroud)

因此,是删除字符串的第一行和最后一行的最短代码.我认为.find和.rfind方法除了搜索给定的字符串之外什么都不做.试试速度吧!