Python快速字符串解析和操作

4

我正在使用Python解析传入的逗号分隔字符串。之后我想对数据进行一些计算。字符串长度为800个字符,有120个逗号分隔字段。需要处理1.2百万个这样的字符串。

for v in item.values():
         l.extend(get_fields(v.split(',')))  
#process l 

get_fields使用operator.itemgetter()从120个字段中提取约20个字段。

整个操作需要大约4-5分钟,不包括获取数据的时间。在程序的后半部分,我将这些行插入到sqlite内存表中以供进一步使用。但是,仅仅解析和获取列表就需要4-5分钟的时间,这对我的项目来说并不好。

我在大约6-8个线程中运行此处理过程。

转换为C/C++会有帮助吗?


1
你正在调用一个需要迭代处理800个字符的函数,并且你要执行一百万次。即使对于计算机来说,这也是一个很大的负担。 - tlayton
2
http://docs.python.org/library/csv.html - kennytm
1
如果你打算重新发明轮子,你应该看看这篇文章:https://dev59.com/3XA75IYBdhLWcg3w4tN7 还应该了解生成器。 - Wayne Werner
你的意思是,“不包括导入数据的时间”? - Owen S.
基本上,我在没有字符串处理的情况下运行了代码,然后再次进行处理以获取字符串处理部分的时间。 - Sujit
2个回答

3
你是否在加载一个包含文件记录的字典?直接处理数据可能更好:
datafile = file("file_with_1point2million_records.dat")
# uncomment next to skip over a header record
# file.next()

l = sum(get_fields(v.split(',')) for v in file, [])

这样可以避免创建任何整体数据结构,只会累积由get_fields返回的所需值。

2

你的程序可能因为尝试分配足够内存来容纳1.2M个字符串而变慢。换句话说,速度问题可能不是由于字符串解析/操作引起的,而是在l.extend中。为了测试这个假设,你可以在循环中放置一个打印语句:

for v in item.values():
    print('got here')
    l.extend(get_fields(v.split(',')))  

如果打印语句变得越来越慢,你可以推断l.extend是罪魁祸首。在这种情况下,如果你能将每行的处理移入循环中,可能会看到显著的速度提升。
PS:你应该使用csv模块以更高级的方式处理解析,但我认为这不会对速度产生太大影响。

1
timeit模块(http://docs.python.org/library/timeit.html)可能有助于确定事物需要多长时间。 - GreenMatt
1
我建议使用快速而简单的方法,因为如果您无法看到明显的减速,则内存分配不是问题。 - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接