【问题标题】:Comparison of Python and Perl solutions to Wide Finder challengeWide Finder 挑战的 Python 和 Perl 解决方案比较
【发布时间】:2010-09-12 13:21:20
【问题描述】:

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

Wide Finder: Results

【问题讨论】:

    标签: python performance perl analysis


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      毕竟 Perl 是 文本处理语言。

      【讨论】:

      • 据我所知,示例日志是 ASCII,Python 版本使用字节字符串,没有任何 Unicode 转换。所以我相信这里没有“utf-8 vs utf-16”。
      • 我同意康斯坦丁。我看不出 unicode 与它有什么关系。
      【解决方案3】:

      已针对 Perl 发布了多核引擎 (MCE)。 MCE 在这方面做得很好,即使直接从具有 8 个工作人员的磁盘读取(冷缓存)也是如此。与 wf_mmap 进行比较。 MCE 在读取输入数据时遵循银行排队模型。查看图片文件夹下的幻灯片。

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

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

      在 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
      

      【讨论】:

        【解决方案4】:

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

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

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

        mmap 可能主要负责与使用普通 Python IO 库的 Python 版本的性能差异 - 这还引入了寻找换行符的开销。

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

        【讨论】:

        • Python 版本也使用 mmap。而且Python的正则表达式也直接对mmap进行操作。
        【解决方案5】:

        Perl 实现使用 mmap 系统调用。

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

        【讨论】:

        • Python 版本也是基于 mmap 的。但是您能否详细说明“mmap 为 Perl 版本提供异步 I/O”?
        猜你喜欢
        • 1970-01-01
        • 2022-06-10
        • 2017-08-19
        • 2022-01-16
        • 2019-02-19
        • 2019-08-17
        • 2010-09-06
        • 1970-01-01
        • 2011-09-06
        相关资源
        最近更新 更多