比较Python和Perl解决方案对Wide Finder的挑战
如果我们能将获奖的ORourke的Perl解决方案与Lundh的Python解决方案进行比较,我将不胜感激,因为我不知道Perl足够了解其中的情况。更具体地说,我想知道是什么赋予了Perl 3x版优势:算法优势,C扩展质量,其他因素?
宽屏查找器:结果
解决方案
Perl已针对文本处理进行了优化。有太多因素,很难说出确切的区别。文本在内部的表示方式完全不同(utf-8与utf-16 / utf-32),而正则表达式引擎也完全不同。 Python的正则表达式引擎是自定义引擎,而不是perl的常用引擎。与Perl(基本上是"语言的核心")相比,很少有开发者在使用它(我认为它基本上没有维护)。
毕竟Perl是文本处理语言。
Perl更好的正则表达式实现是故事的一部分。但是,这不能解释为什么perl实现可以更好地扩展。随着更多的处理器,差异变得更大。由于某种原因,python实现在那里存在问题。
Perl实现使用mmap系统调用。该调用所做的是建立指向该进程的指针,该指针似乎是程序的内存或者缓冲区的正常段。它将文件的内容映射到内存区域。与普通文件IO(读取)相比,这样做有性能上的优势,一个是不需要访问数据的用户空间库调用,另一个是通常需要较少的复制操作(例如:在内核之间移动数据和用户空间)。
Perl的字符串和正则表达式是基于8位字节的(例如,与Java的utf16相反),因此Perl的本机"字符类型"与mmapped文件的编码相同。
然后,当正则表达式引擎对mmap支持的变量进行操作时,它将直接通过映射的内存区域访问文件数据,而无需通过Perl的IO函数甚至libc的IO函数。
与使用常规Python IO库的Python版本相比,mmap可能是造成性能差异的主要原因,这另外会增加寻找换行符的开销。
Perl程序还支持-J使处理并行化,其中oepen"-|"导致fork(),其中父级中的文件句柄指向孩子的stdout。子进程将其结果序列化为stdout,而父进程将其反序列化以协调和汇总结果。
The Perl implementation uses the mmap system call.
这。它避免了缓冲区复制,并提供了异步I / O。