在查看Python built-in函数列表时,我很难理解方法compile
的有用性。我能找到的所有例子都指向一个简单的“你好世界”。 它是什么意思,但 时使用
这与Python用于生成.pyc文件的方法相同吗?
这可以用来删除Python的一些动态特性,以提高某些代码块的性能吗? (完全清楚C中的模块是预编译模块的方法。)
答案 0 :(得分:6)
从这里开始:What's the difference between eval, exec, and compile in Python?:
compile
是exec
和eval
的较低级别版本。它不会执行或评估您的语句或表达式,而是返回可以执行此操作的代码对象。模式如下:
compile(string, '', 'eval')
返回在您完成eval(string)
后已执行的代码对象。请注意,不能在此模式下使用语句;只有(单个)表达式有效。compile(string, '', 'exec')
返回在您完成exec(string)
后已执行的代码对象。你可以在这里使用任意数量的陈述。compile(string, '', 'single')
与exec
模式类似,但除了第一个语句外,它将忽略所有内容。请注意,if
/ else
语句及其结果被视为单个语句。更新:
何时编译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
文件。