【发布时间】: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,您的结果会更有意义。