Python 让你的蟒蛇快一点

Python 让你的蟒蛇快一点,python,makefile,Python,Makefile,我正在主目录中构建Python2.6.6,并尝试优化我正在使用的包的速度和内存使用。在阅读中,有人说,CFLAGS='-g-O2'应该会让它更快 经过一番搜索,我了解到这是传递给编译器的某种标志,但它们没有解释为什么这会优化python速度(实际上,似乎其他值优化了其他东西,比如ruby) 我想更好地理解它,以便在我所做的事情中获得更高的绩效,因为目前这需要花费很多时间。有人能解释这些标志的含义吗?在什么意义上它能提高python的速度?谢谢-O是一个通用编译器标志,用于启用编译器优化。编译器执

我正在主目录中构建Python2.6.6,并尝试优化我正在使用的包的速度和内存使用。在阅读中,有人说,
CFLAGS='-g-O2'
应该会让它更快

经过一番搜索,我了解到这是传递给编译器的某种标志,但它们没有解释为什么这会优化python速度(实际上,似乎其他值优化了其他东西,比如ruby)


我想更好地理解它,以便在我所做的事情中获得更高的绩效,因为目前这需要花费很多时间。有人能解释这些标志的含义吗?在什么意义上它能提高python的速度?谢谢

-O
是一个通用编译器标志,用于启用编译器优化。编译器执行这些优化是为了提高性能,特别是与根本不进行任何优化相比。但是,优化会增加编译时间,一些优化可能会使最终代码变大

在GCC编译器系列中,
-O
后面可以跟一个字母或数字,指定要执行的优化级别。默认情况下没有优化(对于最快的编译)
-O
是基本的优化
-O2
是更多的优化,而
-O3
是激进的(有时是不安全的)优化。对于大多数项目来说,通常的级别是
-O2
,因为它提供了良好的性能改进,而不会大幅增加代码大小或潜在地引入bug。此外,您可以使用
-Os
来最小化代码大小,而不是提高代码速度

值得注意的是,大多数已发布的Python版本都已经进行了一定程度的优化,因此您不太可能通过创建自己的版本来获得巨大的性能提升。如果程序运行缓慢,则可能需要对算法进行更改,以使程序运行更快


-g
意味着生成调试信息,并使Python调试更容易。除非您是为Python开发的,否则不需要它,但也不需要它(除了使最终二进制文件稍微大一点)。

O2标志指示C编译器进行某些优化选择,请参阅

Python解释器是用C语言编写的;优化编译器生成的机器代码意味着程序可以运行得更快,因为代码避免了一些常见的速度瓶颈。这不仅仅适用于Python

缺点是某些激进的优化可能会引入错误或降低速度,因为为这些优化所做的假设被证明是不正确的。在不同的程序中,工作原理是不同的;如果不深入了解优化的作用,也没有一个完整的测试套件来捕获引入的任何问题,您应该远离这些标志,除非有人告诉您使用优化设置


你最好还是专注于优化你自己的Python代码;在那里可以获得更大的收益。分析代码,重新考虑数据结构,如果需要,将C语言中的部分重写为Python扩展。有时,某些任务需要时间,这是您正在处理的问题空间的一个事实。

值得一提的是,我需要这一改进,因为
MaxentClassifier
NLTK
包中的性能在最新版本的python和scipy中运行需要花费太多时间,因此,我尝试创建这个旧环境。这些标志优化了编译C时生成的机器代码。这可能会使任何C程序运行得更快,而不仅仅是Python。有关不同优化级别的说明,请参阅。正如Martijn所说,它们适用于每一个编译的C程序,而不仅仅是Python。@MartijnPieters那么,我每次都能在任何linux发行版的所有程序中使用它们吗?如果是这种情况,为什么C编译器在默认情况下不使用此标志?谢谢你的评论:)@rafa:它们不是编译器的默认值,但在典型的Linux发行版中,它们通常对每个二进制文件都启用。