gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:10:50 25 4
gpt4 key购买 nike

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

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

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

示例字符串:

*** START OF DATA ***
data
data
data
*** END OF DATA ***

额外的功劳:如果中间没有数据,这个程序不会卡住;这是可选的,因为对于我的情况,不应有中间没有数据的字符串。

最佳答案

首先在'\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

或者根本不拆分,从任意一端找到 '\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

关于python - 从 Python 字符串中删除第一行和最后一行的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28134319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com