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

时间:2013-07-27 18:28:43

标签: python compilation built-in

在查看Python built-in函数列表时,我很难理解方法compile的有用性。我能找到的所有例子都指向一个简单的“你好世界”。 是什么意思,但 时使用

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

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

1 个答案:

答案 0 :(得分:6)

从这里开始:What's the difference between eval, exec, and compile in Python?

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

  1. compile(string, '', 'eval')返回在您完成eval(string)后已执行的代码对象。请注意,不能在此模式下使用语句;只有(单个)表达式有效。
  2. compile(string, '', 'exec')返回在您完成exec(string)后已执行的代码对象。你可以在这里使用任意数量的陈述。
  3. compile(string, '', 'single')exec模式类似,但除了第一个语句外,它将忽略所有内容。请注意,if / else语句及其结果被视为单个语句。
  4. 更新:

    何时编译Python?

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

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

    在此magnificent article中引用:

      

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

    特别值得注意的是:

      

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

         

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

         

    $ python -mtimeit -s'code = compile(“a = 2; b = 3; c = a * b”,

      “”,“exec”)''exec code'1000000循环,最佳3:0.765 usec   每个循环

         对于一个非常短的代码示例,

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