![]() |
1
5
下面是一种使用itertools进行一般类型拆分的方法
groupby单独处理src中的每个字符,因此性能可能并不理想,但它确实避免了创建任何中间的大型数据结构
比较性能是OP尝试真实数据的一个练习 |
![]() |
2
5
当然,如果你使用
|
![]() |
3
4
这个非常小的更改避免了在代码中构建两个临时列表中的一个,并且不需要您付出任何努力。 避免临时构造两个列表的完全不同的方法是使用正则表达式:
这不仅可以避免创建临时列表,还可以避免为输入中的每一行创建临时字符串。以下是建议解决方案的一些性能度量: init = r''' import re, StringIO regex = re.compile('^#.*\n?', re.M) src = ''.join('foo bar baz\n' for _ in range(100000)) ''' method1 = r'"\n".join([line for line in src.split("\n") if line[:1] != "#"])' method2 = r'"\n".join(line for line in src.split("\n") if line[:1] != "#")' method3 = 'regex.sub("", src)' method4 = ''' buffer = StringIO.StringIO(src) dest = "".join(line for line in buffer if line[:1] != "#") ''' import timeit for method in [method1, method2, method3, method4]: print timeit.timeit(method, init, number = 100) 结果: 9.38s # Split then join with temporary list 9.92s # Split then join with generator 8.60s # Regular expression 64.56s # StringIO 如您所见,正则表达式是最快的方法。 从你的评论我可以看出你不是 有兴趣避免创建临时对象。您真正想要的是减少程序的内存需求。临时对象不一定会影响程序的内存消耗,因为Python擅长快速清除内存。问题来自于对象在内存中的持续时间超过了它们需要的时间,所有这些方法都有这个问题。 如果你的内存仍然不足,那么我建议你不应该完全在内存中进行这个操作。相反,将输入和输出存储在磁盘上的文件中,并以流方式从中读取。这意味着您从输入中读取一行,向输出中写入一行,读取一行,写入一行,等等。这将创建许多临时字符串,但即使如此,它也几乎不需要内存,因为您一次只需要处理一个字符串。 |
![]() |
4
2
如果我正确理解您关于“对split()的更通用调用”的问题,您可以使用
在这里,您可以用更复杂的东西替换正则表达式。 |
![]() |
5
1
|
![]() |
Ben · 统计向量中的单词在字符串中出现的频率 6 月前 |
![]() |
bear_525 · 从列中删除中间名和首字母,并保存在单独的列中 8 月前 |
![]() |
asdfadf · 为什么具有相同内存值的字符串和整数打印方式不同? 8 月前 |
![]() |
user764754 · 防止多行原始字符串文字中出现新行字符 8 月前 |
![]() |
Bogaso · 从列表中返回与模式匹配的元素 8 月前 |
![]() |
Jasco · 如何使用VBA提取两个相似字符之间的字符串中的单词? 8 月前 |