让Python性能超过一切语言?当然可行,为什么不可行呢?

2019 年 2 月 15 日 Python程序员


本文的核心思想是,编程语言的语法简洁度和该语言的运行效率之间其实没有必然的联系,没有理由认为Python注定比C运行得慢。只要在LLVM层更好地实现针对硬件平台的性能优化,Python的执行效率完全可以与C相媲美。(当然这种优化技术上并不简单,所以目前还迟迟没有实现,但是理论上是可行的。)


此文承接“超越C语言元编程的LAPACK”和“大大优于C++元编程的LAPACK”。这两篇文章描述了使用编译器为你生成高性能代码的语言技巧。但是你真的需要编译器吗?

另一种方法是用普通的汇编程序设计。虽然它现在已经被吹到天上去了,但这种方法还是有两个主要缺陷。

1.汇编代码不可移植。


2.虽然使用现代工具变得更容易,但汇编程序设计仍然需要大量繁琐的工作。

值得庆幸的是,我们都生活在二十一世纪,这两个问题都已得到解决。

第一个解决方案是LLVM。 最初,它意味着“低级虚拟机”,这正是我们想要确保可移植性的原因。 简而言之,它需要一些用非常低级别的硬件无关语言编写的代码,并为特定的硬件平台返回一些高度优化的本机代码。使用LLVM,我们既具有低级编程的强大功能,又具有面向硬件的微优化的自动化。

第二个问题的解决方案是您想要的任何“脚本”语言。Scheme,Python,Perl,甚至bash或AWK都可以。它们都是为了消除繁琐的工作而诞生的。您每天用于自动化的所有内容都可用于生成高性能的代码。


计划

让我们重复我之前在帖子中对C和C ++所做的相同实验。让我们生成一个完全内联的完全展开的解决方案,并将其嵌入到基准测试代码中。该计划如下。

1.使用Clang为基准生成LLVM中间代码,该基准应该测量名为solve_5的不存在的函数。
2.使Python在LLVM中生成线性求解器代码。
3.使用Python脚本劫持基准,用生成的求解器替换solve_5调用。
4.使用LLVM静态编译器将中间代码转换为机器代码。
5.使用GNU汇编器和Clang的链接器将机器代码转换为可执行的二进制文件。

这就是它在Makefile中的样子:



Python部分

我们需要Python中的线性求解器,就像我们使用C和C ++一样。 这里是:



当我们用数字运行时,我们得到了数字。但我们想要代码。因此,让我们制作一个假装成数字的对象来监视算法。写下算法希望它在准备好组装LLVM中间语言时执行的每个操作的对象。



现在,当我们使用这种对象运行求解器时,我们得到了一个用LLVM中间语言编写的全功能线性求解器。然后我们将它放入基准代码中,看它有多快。

LLVM中的指令已编号,我们希望保留此枚举,因此将我们的代码插入到我们的基准测试中的功能并非易事。但它也不是很复杂。



实现求解器的整段代码提供了Python-to-LLVM层,代码插入只有100行! 你可以在GitHub上看到它。

基准

基准测试本身在C中。当我们运行Makefile时,它对solve_5的调用被Python生成的LLVM代码所取代。



最值得注意的是Python脚本生成的超详细中间代码如何变成一些非常紧凑且非常有效的硬件代码。它也是高度超级标量化的。但它是否足以与C和C ++解决方案竞争?

以下是三种情况的近似数字:带有技巧的C,带有技巧的C ++和带有Python-LLVM。

C的技巧对Clang来说并不适用,因此测量GCC版本。 它平均运行大约70毫秒。
C ++版本是用Clang构建的,运行时间为60毫秒。
Python版本(此处描述的版本)仅运行55毫秒。


当然,这种加速并不是你想要追求的东西。但它表明你可以用Python编写的程序胜过用C或C ++编写的程序。您不必学习一些特殊语言来创建高性能的应用程序或库。

结论

我认为快速编译语言和慢速脚本语言之间的二分法是虚张声势。本机代码生成可能不是核心功能,而是类似可插拔选项。像一个图书馆。就像Numba for Python一样。想想它的好处:您可以用一种语言进行研究和快速原型设计,然后使用相同的语言生成高性能的代码。

高性能计算没有理由保留编译语言的特权。编译器只是用于代码生成的软机器。您可以使用您想要的任何语言生成代码。我相信如果你愿意,你可以教Matlab生成超快的LLVM代码。

所有测量均在Intel(R)Core(TM)i7-7700HQ CPU @ 2.80GHz上进行,代码使用clang版本3.8.0-2ubuntu4和g ++ 5.4.0编译,-march = native -O2。基准测试的源代码可在Github上获得。



英文原文:https://wordsandbuttons.online/outperforming_everything_with_anything.html  
 译者:游骑兵


登录查看更多
0

相关内容

元编程又译超编程,是指某类计算机程序的编写,这类计算机程序编写或者操纵其它程序(或者自身)作为它们的资料,或者在运行时完成部分本应在编译时完成的工作。多数情况下,与手工编写全部代码相比,程序员可以获得更高的工作效率,或者给与程序更大的灵活度去处理新的情形而无需重新编译。
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
Python导论,476页pdf,现代Python计算
专知会员服务
254+阅读 · 2020年5月17日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
173+阅读 · 2020年1月1日
Python用法速查网站
Python程序员
17+阅读 · 2018年12月16日
各编程领域最好的入门书籍
程序猿
27+阅读 · 2018年7月29日
如果聊天机器人想要成功,还需要这个……
这可能是学习Python最好的免费在线电子书
程序猿
51+阅读 · 2018年5月17日
那个学Python的同龄人,也许已经抛弃了你
Python为啥这么牛?
Python程序员
3+阅读 · 2018年3月30日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
为什么 Python 更适合做 AI/机器学习?
计算机与网络安全
10+阅读 · 2018年3月18日
观点 | 为什么我对MATLAB情有独钟
机器之心
5+阅读 · 2017年12月4日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
Real-time Scalable Dense Surfel Mapping
Arxiv
5+阅读 · 2019年9月10日
Arxiv
8+阅读 · 2018年11月21日
Arxiv
4+阅读 · 2018年11月7日
Doubly Attentive Transformer Machine Translation
Arxiv
4+阅读 · 2018年7月30日
Bidirectional Attention for SQL Generation
Arxiv
4+阅读 · 2018年6月21日
Arxiv
3+阅读 · 2018年6月1日
Arxiv
5+阅读 · 2018年3月16日
VIP会员
相关资讯
Python用法速查网站
Python程序员
17+阅读 · 2018年12月16日
各编程领域最好的入门书籍
程序猿
27+阅读 · 2018年7月29日
如果聊天机器人想要成功,还需要这个……
这可能是学习Python最好的免费在线电子书
程序猿
51+阅读 · 2018年5月17日
那个学Python的同龄人,也许已经抛弃了你
Python为啥这么牛?
Python程序员
3+阅读 · 2018年3月30日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
为什么 Python 更适合做 AI/机器学习?
计算机与网络安全
10+阅读 · 2018年3月18日
观点 | 为什么我对MATLAB情有独钟
机器之心
5+阅读 · 2017年12月4日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
相关论文
Real-time Scalable Dense Surfel Mapping
Arxiv
5+阅读 · 2019年9月10日
Arxiv
8+阅读 · 2018年11月21日
Arxiv
4+阅读 · 2018年11月7日
Doubly Attentive Transformer Machine Translation
Arxiv
4+阅读 · 2018年7月30日
Bidirectional Attention for SQL Generation
Arxiv
4+阅读 · 2018年6月21日
Arxiv
3+阅读 · 2018年6月1日
Arxiv
5+阅读 · 2018年3月16日
Top
微信扫码咨询专知VIP会员