【问题标题】:Python fast string parsing, manipulationPython 快速字符串解析、操作
【发布时间】:2011-03-11 06:14:24
【问题描述】:

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

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++ 会有所帮助吗?

【问题讨论】:

  • 您正在调用一个需要遍历 800 个字符的函数,并且您正在执行超过一百万次。即使是计算机,也需要处理很多事情。
  • 如果你打算重新发明轮子,你应该看看这篇文章:stackoverflow.com/questions/3055477/… 你也应该看看发电机。
  • 什么意思,“不包括引入数据的时间”?
  • 基本上我在没有字符串处理的情况下运行代码,然后在处理后再次运行以获得字符串处理部分的时间。

标签: python performance string parsing


【解决方案1】:

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

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。为了检验这个假设,你可以在循环中加入一个 print 语句:

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

    如果打印语句越来越慢,您可能会断定l.extend 是罪魁祸首。在这种情况下,如果您可以将每行的处理移到循环中,您可能会看到速度显着提高。

    PS:您可能应该使用csv 模块以更高级别的方式为您处理解析,但我认为这不会对速度产生太大影响。

    【讨论】:

    • timeit 模块 (docs.python.org/library/timeit.html) 可能有助于确定需要多长时间。
    • 我建议了一种快速而肮脏的方法,因为如果您不能看到明显的减速,那么内存分配就不是问题了。
    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 2020-03-26
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多