python - 简单的硬编码算法是否被缓存/编译掉了?

标签 python python-internals

我想知道 python 是否在其 .pyc 文件中缓存/编译简单的算术,如 5*5+5

有时候我喜欢写 if seconds > 24*60*60 例如一天。我知道对性能的影响并不明显,但我还是很好奇。

最佳答案

是的,CPython(Python 的默认实现)使用 peephole optimiser将这些表达式折叠成一个数字;这叫做constant folding .

您可以使用 dis disassembler 检查这一点:

>>> import dis
>>> def foo():
...     if seconds > 24*60*60:
...         pass
...
>>> dis.dis(foo)
  2           0 LOAD_GLOBAL              0 (seconds)
              3 LOAD_CONST               4 (86400)
              6 COMPARE_OP               4 (>)
              9 POP_JUMP_IF_FALSE       15

  3          12 JUMP_FORWARD             0 (to 15)
        >>   15 LOAD_CONST               0 (None)
             18 RETURN_VALUE

注意偏移量 3 处的 LOAD_CONST 指令;它加载了 24*60*60 表达式的最终结果,表达式本身从字节码中消失了。

参见 fold_binops_on_constants function in the peephole.c file .

关于python - 简单的硬编码算法是否被缓存/编译掉了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36105978/

相关文章:

python - 无法通过Python访问Samba服务器上的文件

python - 为什么 numpy 数组有 96 字节的开销?

Python编译/解释过程

python - Python 2.x 中的字符串使用哪种编码?

python - Python中的空元组是 "constant"吗

python - 运行 python 生成器清理代码的最佳方式

python - matplotlib 图例位置编号

python - Django Tastypie : Filtering by ForeignKey

python - 用 Python 读取一个大的 .mbox 文件

python - 如何找出内部字符串编码?