【问题标题】:Python with large files slower than perl: what am I doing wrong? [closed]大文件的 Python 比 perl 慢:我做错了什么? [关闭]
【发布时间】:2017-03-18 06:02:51
【问题描述】:

我越来越多地使用 python 而不是 perl,但有一个问题:总是当我想逐行处理大文件 (>1GB) 时,python 似乎需要很长时间才能完成 perl 在很短的时间内完成的工作。然而,网络上的普遍看法似乎是 python 至少应该和 perl 一样快的文本处理。所以我的问题是我做错了什么?

例子:

逐行读取文件,在每个选项卡处拆分行并将第二项添加到列表中。 我的 python 解决方案看起来像这样:

with open() as infile:
    for line in infile:
        ls = line.split("\t")
        list.append(ls[1])

perl 代码如下所示:

open(my $infile,"<",file_path);
while(my $line=<$infile>){
    my @ls = split(/\t/,$line);
    push @list, $ls[1]
}
close($infile)

有什么办法可以加快速度吗?

并且明确一点:我不想启动通常的“[填写脚本语言 A 的名称] 比 [填写脚本语言 B] 好得多”的线程。我想更多地使用 python,这对我的工作来说是一个真正的问题。

有什么建议吗?

【问题讨论】:

  • 拥有list 后,您想做什么? Python对生成器和迭代器有很好的支持,你可以在yield ls[1]里面追加到一个全局变量。
  • 我们在这里谈论什么样的性能差异?
  • 我在一个包含 1000 万行 "foo\tbar\tbaz\tbiff\n" 的简单 CSV 文件上针对 the equivalent Perl code 运行了您的代码,Python 代码的运行速度提高了两倍。你能展示你等效的 Perl 代码吗?此外,您的代码不是真实的,open 缺少参数。你能告诉我们真正的代码吗?最后,为什么你认为那段代码是性能问题?
  • 我同意 Schwern:Python 的速度大约是前者的两倍。请创建一个基准,显示 1)您的示例数据,或如何生成它 2)两个程序的实际代码 3)您如何测量时间 4)实际时间 5)有关您的设置的详细信息,例如关于正在运行您在 cmets 中提到的 NFS。
  • 版本?最后我检查了一下,用 usefaststdio 构建的旧 perls 可能比必须支持 PerlIO 层的新 perls 快得多。如果您使用的是这么旧的 Perl,您的结果会更有意义。

标签: python perl


【解决方案1】:

有什么办法可以加快速度吗?

是的,import the CSV in SQLite and process it there。在您的情况下,您需要.mode tabs 而不是.mode csv

使用任何编程语言来操作 CSV 文件都会很慢。 CSV 是一种数据传输 格式,而不是一种数据存储格式。由于您不断地重新解析和重新处理 CSV 文件,因此使用它们总是很慢且笨拙。

将其导入 SQLite 将使其成为具有索引的更高效的数据格式。这将花费与 Python 一样多的时间,但只需执行一次。它可以使用 SQL 进行处理,这意味着编写、调试和维护的代码更少。

Sqlite vs CSV file manipulation performance

【讨论】:

  • 感谢您的建议,但鉴于我必须在我们的计算集群上使用 NFS,SQLite 不是一个选项(由于已知的“数据库锁定”问题,已经这样做了并且丢失了两次数据库)。此外,我的 perl 代码运行速度相当快,但如前所述,我认为可能有一种仅使用 python 的“漂亮”方式。还是谢谢
猜你喜欢
  • 2012-11-07
  • 2013-02-08
  • 1970-01-01
  • 2017-08-23
  • 2022-12-17
  • 2014-02-16
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多