【问题标题】:Fastest way to extract only certain fields from comma separated string in Python在Python中从逗号分隔的字符串中仅提取某些字段的最快方法
【发布时间】:2013-05-13 06:16:46
【问题描述】:

假设我有一个字符串,其中包含来自数据库或电子表格的逗号分隔格式的数据。

例如:

data = "hello,how,are,you,232.3354,good morning"

假设这些“记录”中可能有 200 个字段。

我有兴趣查看此记录的某些字段。用 Python 最快的方法是什么?

最简单的方法是这样的:

fields = data.split(",")
result = [fields[4], fields[12], fields[123]]

有没有更快的方法来做到这一点,利用以下事实:

  1. 您只需为结果分配一个包含 3 个元素和 3 个字符串对象的列表。
  2. 您可以在到达字段 123 后停止扫描数据字符串。

我尝试编写一些代码,使用重复调用 find 来跳过传递的逗号,但如果最后一个字段在字符串下方太远,这将比基本拆分解决方案慢。

我正在处理数百万条记录,因此欢迎任何加速。

【问题讨论】:

  • 用 Python 解决方案很难击败原生 str.split()
  • 我不知道它是否更快,但您可以避免使用data.split(",", 124) 拆分整个字符串。
  • 您确定这是您应用程序的瓶颈吗?您需要多快才能将瓶颈转移到应用中的其他位置?

标签: python performance csv split


【解决方案1】:

您不会比将所有内容加载到内存中然后删除您需要的部分更好。我的建议是压缩和更好的库。

碰巧我有几个大小合适的 csv 文件(这个是 500k 行)。

> import gzip
> import pandas as pd
> %timeit pd.read_csv(gzip.open('file.csv.gz'))
1 loops, best of 3: 545 ms per loop

删除列也很快,我不确定主要成本是多少。

> %timeit csv[['col1', 'col2']]
100 loops, best of 3: 5.5 ms per loop

【讨论】:

    【解决方案2】:

    如果result 可以是tuple 而不是列表,则使用operator.itemgetter 可能会加快速度(如果您要进行多次调用):

    from operator import itemgetter
    indexer = itemgetter(4,12,123)
    result = indexer(data.split(','))
    

    您需要timeit 才能实际查看您是否获得了加速。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多