繁体   English   中英

Python内置'compile'的主要用途是什么?

[英]What is the main use of the Python built-in 'compile'?

在查看Python内置函数列表时,我很难理解该方法compile的有用性。 我能找到的所有例子都指向一个简单的“你好世界”。 很有意义它做什么 ,而不是使用它。

这与Python用于生成.pyc文件的方法相同吗?

这可以用来删除Python的一些动态特性,以提高某些代码块的性能吗? (完全清楚C中的模块是预编译模块的方法。)

从这里: Python中的eval,exec和compile有什么区别?

compileexeceval的低级版本。 它不会执行或评估您的语句或表达式,而是返回可以执行此操作的代码对象。 模式如下:

  1. compile(string, '', 'eval')返回在你完成eval(string)已经执行的代码对象。 请注意,您不能在此模式下使用语句; 只有(单个)表达式有效。
  2. compile(string, '', 'exec')返回执行exec(string)已执行的代码对象。 您可以在此处使用任意数量的语句。
  3. compile(string, '', 'single')就像exec模式一样,但它会忽略除第一个语句之外的所有内容。 请注意,带有结果的if / else语句被视为单个语句。

更新:

什么时候编译Python?

通常,您编译Python以利用性能。 编译代码的启动时间要快得多,因为它不需要编译,但运行速度不快

最值得注意的是,如果要手动将代码转换为字节码,则可以使用compile 这提出了另一个重要但相关的问题为什么这样做?

正如这篇华丽文章中所提到的

如果你想使用exec并计划多次执行该代码,请确保先将其编译为字节码,然后仅执行该字节码,并仅在新字典中作为命名空间。

特别值得注意的是:

现在执行字节码比创建字节码和执行字节码要快多少?:

$ python -mtimeit -s'code =“a = 2; b = 3; c = a * b”''exec code'10000循环,最佳3:22.7 usec per loop

$ python -mtimeit -s'code = compile(“a = 2; b = 3; c = a * b”,
“”,“exec”)''exec code'1000000循环,最佳3:0.765 usec每循环

对于一个非常短的代码示例,速度快32倍。 你拥有的代码越多,情况就越糟糕。 为什么会这样? 因为与评估字节码相比,解析Python代码并将其转换为字节码是一项昂贵的操作。 那当然也会影响完全不使用字节码缓存的execfile ,应该怎么做。 如果你将路径传递给foo.py文件,它不会神奇地检查是否有.pyc文件。

要回答动态本质的事情,不,不是真的。 生成的代码对象仍然被解释; 相同的字节码仍然运行。

我见过的最有用/令人印象深刻的compile()(和代码生成)用法是在Jinja2中。 它实际上从您的模板生成Python代码,然后使用编译,因此它以“本机”(==解释器)速度运行,如果这是有意义的。

https://github.com/mitsuhiko/jinja2/blob/master/jinja2/environment.py#L506

与django.template相反,后者在“用户空间”中执行变量查找等(再次,可以这么说 - 隐喻有点奇怪)。

https://github.com/django/django/blob/master/django/template/base.py#L752

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM