我有一个大文本文件,就是这样的:
[('hello','how','do'),('you','do','I'),('am','fin','what'), ...]
它由大约500,000个句子构成。我必须足够快地解压缩这样,我得到一个在每个索引中都有三元组字的列表,如:
lst = [['hello', 'how', 'do'], ['you', 'do', 'I'], ['am', 'fin', 'what'], ..]
我尝试了一种与),(
分割的简单方法,但它非常慢。任何人都可以建议吗?
答案 0 :(得分:4)
你应该做缓冲。有re.finditer()
函数返回迭代器对象,但split()
立即生成一个列表。
>>> text = "[('hello','how','do'),('you','do','I'),('am','fin','what')]"
>>> rv = []
>>> for match in re.finditer(r"\(([',\w\d]+)\)", text):
... rv.append([
... s[1:-1] for s in match.group(1).split(',')
... ])
...
>>> rv
[['hello', 'how', 'do'], ['you', 'do', 'I'], ['am', 'fin', 'what']]
实际上我不知道你的split(',')
花了多少时间,无论如何,上面的代码似乎对我的MacBook Air中的58,000,011字节字符串来说并不是非常慢:
>>> timeit.timeit('''\
... [[s[1:-1] for s in match.group(1).split(',')]
... for match in re.finditer(r"\(([',\w\d]+)\)", text)]
... ''', setup='''\
... text = "('hello','how','do'),('you','do','I'),('am','fin','what'),"
... text *= 1000000
... text = "[%s('hello')]" % text
... import re
... ''', number=1)
10.264044046401978
补充:我用较短的文字测量ast.literal_eval()
方式,但需要更长的时间。
>>> timeit.timeit('''\
... lst = ast.literal_eval(text.replace('(', '[').replace(')', ']'))
... ''', setup='''\
... text = "('hello','how','do'),('you','do','I'),('am','fin','what'),"
... text *= 200000
... text = "[%s('hello')]" % text
... import ast
... ''', number=1)
12.93752384185791
答案 1 :(得分:0)
请你试试这个片段:
使用内存映射文件使用操作系统虚拟内存系统直接访问文件系统上的数据,而不是使用普通的I / O功能。内存映射通常可以提高I / O性能,因为它不涉及每次访问的单独系统调用,也不需要在缓冲区之间复制数据 - 内核和用户应用程序都直接访问内存。
import mmap
import ast
import contextlib
final_list = list()
with open('text', 'r') as f:
with contextlib.closing(mmap.mmap(f.fileno(), 0,
access=mmap.ACCESS_READ)
) as m:
l = ast.literal_eval(m[:])
for i in l:
final_list.append(list(i))
print final_list
如果有帮助,请告诉我。