Python和Perl解决方案与Wide Finder挑战的比较

时间:2008-09-23 21:57:12

标签: python performance perl analysis

如果你能将胜利O’Rourke's Perl solutionLundh's Python solution进行比较,我将非常感激,因为我不知道Perl是否足以理解那里发生了什么。更具体地说,我想知道是什么赋予了Perl版本3x的优势:算法优势,C扩展的质量,其他因素?

Wide Finder: Results

5 个答案:

答案 0 :(得分:10)

perl更好的正则表达式实现是故事的一部分。然而,这无法解释为什么perl实现更好地扩展。随着处理器越多,差异越大。由于某种原因,python实现存在问题。

答案 1 :(得分:5)

Perl针对文本处理进行了大量优化。有很多因素很难说出确切的区别。文本在内部完全不同(utf-8与utf-16 / utf-32),正则表达式引擎也完全不同。 Python的正则表达式引擎是一个自定义引擎,并没有像perl那样多。很少有开发人员在研究它(我认为它基本上没有维护),而Perl基本上是“语言的核心”。

毕竟Perl是 文本处理语言。

答案 2 :(得分:3)

许多核心引擎(MCE)已经发布用于Perl。 MCE在这方面表现相当不错,即使直接从具有8名工作人员的磁盘读取(冷缓存)也是如此。与wf_mmap比较。在读取输入数据时,MCE遵循银行排队模型。在images文件夹下查看幻灯片。

源代码托管在http://code.google.com/p/many-core-engine-perl/

可以在https://metacpan.org/module/MCE

上阅读perl文档

在examples / tbray /

下提供了带有MCE的Wide Finder的实现

https://metacpan.org/source/MARIOROY/MCE-1.514/examples/tbray/

享受MCE。

Script....:  baseline1  baseline2  wf_mce1  wf_mce2  wf_mce3  wf_mmap
Cold cache:      1.674      1.370    1.252    1.182    1.174    3.056
Warm cache:      1.236      0.923    0.277    0.106    0.098    0.092

答案 3 :(得分:1)

Perl实现使用mmap系统调用。该调用的作用是建立一个指针,该指针对进程来说似乎是程序的正常内存段或缓冲区。它将文件的内容映射到内存区域。执行此操作与正常文件IO(读取)相比具有性能优势 - 一个是不需要用户空间库调用来访问数据,另一个是通常需要更少的复制操作(例如:在两者之间移动数据)内核和用户空间)。

Perl的字符串和正则表达式是基于8位字节的(例如,与Java的utf16相反),因此Perl的本机“字符类型”与mmapped文件的编码相同。

当正则表达式引擎对mmap支持的变量进行操作时,它通过mamped内存区域直接访问文件数据 - 无需通过Perl的IO函数,甚至libc的IO函数。

与使用普通Python IO库的Python版本相比,mmap可能主要负责性能差异 - 这还会增加寻找换行符的开销。

Perl程序还支持-J来并行处理,其中oepen“ - |”导致fork(),其中父项中的文件句柄是子项的标准输出。子进程将其结果序列化为stdout,父对它们进行反序列化以协调和汇总结果。

答案 4 :(得分:0)

  

Perl实现使用mmap系统调用。

此。它避免了缓冲区复制并提供异步I / O.