【问题标题】:Faster way to get substring in python?在python中获取子字符串的更快方法?
【发布时间】:2018-07-08 23:37:04
【问题描述】:

我正在编写倾斜算法来构造后缀数组,并且我有一个长字符串(长度 >= 4000)。 在 Skew 算法中,我必须构造 Triples ArraySub-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),需要一分钟才能完成。

是否有任何解决方案可以减少该任务的处理时间?

【问题讨论】:

  • 我认为在构建后缀数组时,不要复制所有后缀,而是使用更轻量级的东西,比如起始位置来表示后缀
  • 在倾斜算法中,我需要三重后缀来排序和标记字母表中的字符。 @StephenRauch 的解决方案解决了我的问题。
  • 我认为构建三元组数组很好。但是构建 sub_strings 数组需要 n^2 空间和时间,这违背了在线性时间内构建后缀数组的目的。

标签: python arrays string algorithm performance


【解决方案1】:

使用推导,您可以比使用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']

【讨论】:

    【解决方案2】:

    这可能对您有用,也可能不适用,但是如果您对 bytesmemoryview 对象而不是字符串对象进行操作,则可以进行许多优化。例如,对内存视图进行切片非常便宜。

    【讨论】:

      【解决方案3】:

      如果没有任何外部库并且没有任何循环呢?

      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']
      

      【讨论】:

        猜你喜欢
        • 2020-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        相关资源
        最近更新 更多