[英]Faster way to get substring in python?
我正在编码偏斜算法以构造后缀数组,并且我有一个长字符串(长度> = 4000)。 在偏斜算法中,我必须构造Triples Array和Sub-strings Array 。
例如:我有一个字符串s = 'abcddd'
。
'abc', 'bcd', 'cdd', 'ddd'
'abcddd', 'bcddd', 'cddd', 'ddd', 'dd', 'd'
这是我的解决方案:
import numpy as np
# example
string = 'abdcb.....' (length >= 4000)
temp = 'abdcb......###' (length >= 4000)
triples_arr = np.array([])
sub_strings = np.array([])
for i in range (0, len(temp) - 3):
triples_arr = np.append(triples_arr, temp[i:i + 3])
sub_strings = np.append(sub_strings, string[i:string_len])
对于长字符串(长度> = 4000),需要一分钟才能完成。
有什么解决方案可以减少该任务的处理时间?
使用理解,可以比使用for
循环更快地构造这些字符串:
triples_arr = [a_string[i:i+3] for i in range(0, len(a_string)-1)]
sub_strings = [a_string[i:] for i in range(len(a_string))]
a_string = 'abcdefghijklmnopqrstuvwxyz'
triples_arr = [a_string[i:i+3] for i in range(0, len(a_string)-2)]
print(triples_arr)
sub_strings = [a_string[i:] for i in range(len(a_string))]
print(sub_strings)
['abc', 'bcd', 'cde', 'def', 'efg', 'fgh', 'ghi', 'hij', 'ijk', 'jkl',
'klm', 'lmn', 'mno', 'nop', 'opq', 'pqr', 'qrs', 'rst', 'stu', 'tuv',
'uvw', 'vwx', 'wxy', 'xyz']
['abcdefghijklmnopqrstuvwxyz', 'bcdefghijklmnopqrstuvwxyz',
'cdefghijklmnopqrstuvwxyz', 'defghijklmnopqrstuvwxyz',
'efghijklmnopqrstuvwxyz', 'fghijklmnopqrstuvwxyz',
'ghijklmnopqrstuvwxyz', 'hijklmnopqrstuvwxyz', 'ijklmnopqrstuvwxyz',
'jklmnopqrstuvwxyz', 'klmnopqrstuvwxyz', 'lmnopqrstuvwxyz',
'mnopqrstuvwxyz', 'nopqrstuvwxyz', 'opqrstuvwxyz', 'pqrstuvwxyz',
'qrstuvwxyz', 'rstuvwxyz', 'stuvwxyz', 'tuvwxyz', 'uvwxyz',
'vwxyz', 'wxyz', 'xyz', 'yz', 'z']
这可能对您memoryview
,也可能不起作用,但是如果您对bytes
和memoryview
对象而不是字符串对象进行操作,则可以进行许多优化。 例如,切片memoryviews非常便宜。
没有任何外部lib和任何循环怎么办?
Triples_Array=[]
Sub_strings=[]
def hello(data):
if not data:
return 0
triple=data[:3]
Sub_strings.append(data)
if len(triple)==3:
Triples_Array.append(triple)
return hello(data[1:])
print(hello('abcddd'))
print(Sub_strings)
print(Triples_Array)
输出:
['abcddd', 'bcddd', 'cddd', 'ddd', 'dd', 'd']
['abc', 'bcd', 'cdd', 'ddd']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.