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方法除了搜索给定的字符串之外什么都不做.试试速度吧!