2017-10-10 71 views
-2

我有一个名为indexes的大列表。列表中的每个项目都是一个包含2个整数的元组。整数表示我想要连接成一个较大字符串的一系列子字符串的开始和结束索引。Python - 结合一系列字符串的最快方法

例如,如果indexes列表只有2个条目看起来像这样:[(1, 5), (10,15)]我想有一个输出字符串,它包含索引位置1和5之间的字符以及索引位置10-15之间的字符。 IE将这两个切片连接在一起。

为了更具体一点 - 我的主要字符串实际上是大量十六进制值的字符串版本。我将最终将我的最终字符串转换回二进制版本,然后将其写入文件。目前,我的过程是对大数据集很慢,看起来像这样:

def combineFrames(indexes, largeString): 
    ''' 
    input1 = list of all indexes for start/end of substring 
    input2 = the larger String from which the substrings are being pulled 

    returns a single string that consists of all substrings concatenated together... 

    function also generates a new file that consists of the binary version of the concatenated substrings 
    ''' 

    final_string = "" 

    for seq in indexes: 
     final_string += hexString[seq[0]:seq[1]] 

    fullFile = binascii.unhexlify(final_string) 

    with open("d:\\output_File", 'wb') as f: 
     f.write(fullFile) 

    return fullFile 

目前上述实在是太慢了,我怀疑有一种方法来加速这一过程。思考?

+1

“很慢”有多慢?对于什么尺寸的输入?速度有多快会足够快?你有没有分析过这些? – pvg

+0

我是一个总编程的noob - 只有在这个几个月,所以我不知道任何其他选项或如何剖析这个...这个问题是张贴的,因为一个假设,遍历每个索引可能不是处理它的最好方法,在搜索过程中我找不到其他方法。有没有更好的方法可以提出这个问题(仅供将来参考) – occvtech

+0

大部分情况下都是通过尝试自己回答这些问题 - 现在运行速度有多快?什么是输入的大小/类型?目标是什么?分析可以帮助识别占用时间的代码部分(一个更长的话题,你可以谷歌了),但最初,只是测量所用时间是一个好的开始。另一个好的做法是简要描述你正在解决的一般问题,因为有时候完全不同的整体优化方法。一般来说,对于任何与绩效相关的工作,无论是否存在[SO]问题,更具体的测量和目标越好。 – pvg

回答

4

使用join通常是一种很好的连接字符串的方法。可能看起来是这样的:

final_string = "".join(hexString[seq[0]:seq[1]] for seq in indexes) 
+0

这比我迭代每个切片的方式快得多。非常感谢你。现在我可以去阅读一下关于连接方法的内容了:) – occvtech

1

"".join的方法,因为:

'。加入通常比使用+好,因为像 “A” + “B” + “C”也会创建中间字符串“ab”,并且只有 然后是“abc”,而''.join(['a','b','c'])会直接创建 'abc'。使用更少的内存,更快。

相关问题