Python快速字符串解析,操作

问题描述:

我正在使用python来解析传入的逗号分隔字符串。之后我想对数据做一些计算。 字符串的长度是:800个字符,包含120个以逗号分隔的字段。 有120万个字符串需要处理。Python快速字符串解析,操作

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

get_fields使用operator.itemgetter()以提取约20字段总分120

这整个操作大约需要4-5分钟不计时间在数据带。 在程序的后面部分,我将这些行插入sqlite内存表以供进一步使用。 但是,仅仅解析和获取列表的整体4-5分钟时间并不适合我的项目。

我在6-8线程左右运行这个处理。

切换到C/C++可能有帮助吗?

+1

你正在调用一个需要遍历800个字符的函数,并且你正在做这个函数超过一百万次。即使是电脑,也需要处理很多。 – tlayton 2010-07-02 19:32:26

+2

http://docs.python.org/library/csv.html – kennytm 2010-07-02 19:34:22

+1

如果你打算重新发明*,你应该看看这篇文章:http://*.com/questions/3055477/how-slow- is-pythons-string-concatenation-vs-str-join你也应该看看generator。 – 2010-07-02 19:40:49

您的程序可能会放慢尝试为1.2M字符串分配足够的内存。换句话说,速度问题可能不是由于字符串解析/操作,而是由于l.extend。为了测试这个hypothsis,你可以把一个print语句在循环:

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 2010-07-02 20:04:47

+1

我提出了一个快速和肮脏的方法,因为如果你不能*看到*明显的减速,那么内存分配不是问题。 – unutbu 2010-07-02 20:10:25

您是否正在为您的文件记录加载字典?可能更好地直接处理数据:

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返回积累所需的值。