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

问题描述 投票:0回答:5

如果您能将获胜的 O’Rourke 的 Perl 解决方案Lundh 的 Python 解决方案 进行比较,我将非常感激,因为我对 Perl 的了解还不足以理解那里发生的事情。更具体地说,我想知道是什么给了 Perl 版本 3x 的优势:算法优越性、C 扩展的质量、其他因素?

广角取景器:结果

python performance perl analysis
5个回答
10
投票

Perl 更好的正则表达式实现是故事的一部分。但这无法解释为什么 perl 实现具有更好的扩展性。处理器越多,差异就越大。由于某种原因,Python 实现存在问题。


5
投票

Perl 针对文本处理进行了大量优化。因素太多,很难说清楚到底有什么区别。文本在内部的表示方式完全不同(utf-8 与 utf-16/utf-32),正则表达式引擎也完全不同。 Python 的正则表达式引擎是一种自定义引擎,使用率不如 Perl 引擎那么多。与 Perl 相比,很少有开发人员致力于它(我认为它基本上是无人维护的),Perl 基本上是“语言的核心”。

毕竟 Perl 是文本处理语言。


3
投票

Perl 的众核引擎 (MCE) 已发布。即使在使用 8 个工作线程(冷缓存)直接从磁盘读取时,MCE 在这方面也做得很好。与 wf_mmap 进行比较。 MCE 在读取输入数据时遵循组排队模型。在图像文件夹下查找其中的幻灯片。

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

perl 文档可以在 https://metacpan.org/module/MCE

阅读

示例/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

1
投票

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

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

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

mmap 可能在很大程度上导致了与使用普通 Python IO 库的 Python 版本相比的性能差异 - 这还额外引入了寻找换行符的开销。

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


0
投票

Perl 实现使用 mmap 系统调用。

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

© www.soinside.com 2019 - 2024. All rights reserved.