u0b*_*6ae 47 python optimization assert bytecode
Python有一个标志-O,你可以用它来执行解释器.该选项将生成"优化"字节码(写入.pyo文件),并给出两次,它将丢弃文档字符串.从Python的手册页:
-O启用基本优化.这会将已编译(字节码)文件的文件扩展名从.pyc更改为.pyo.给定两次,导致文档字符串被丢弃.
我认为这个选项的两个主要特点是:
删除所有断言语句.为了速度,这可以防止腐败的程序状态.但是,你不需要大量的断言声明才能有所作为吗?你有任何值得的代码(并且理智吗?)
剥离所有文档字符串.什么应用程序的内存使用如此关键,这是一个胜利?为什么不将所有内容都推入用C编写的模块?
这个选项有什么用?它有真实世界的价值吗?
tzo*_*zot 44
该-O标志的另一个用途是__debug__内置变量的值设置为False.
所以,基本上,你的代码可以有很多"调试"路径,如:
if __debug__:
# output all your favourite debugging information
# and then more
Run Code Online (Sandbox Code Playgroud)
在运行时-O,甚至不会将其作为字节码包含在.pyo文件中; 一个穷人的C-ish #ifdef.
请记住,只有在标志出现时才会删除文档字符串-OO.
Ned*_*der 30
关于剥离断言语句:这是C世界中的标准选项,许多人认为ASSERT的部分定义是它不在生产代码中运行.是否剥离它们有所不同取决于有多少断言,而不是断言这些断言做了多少工作:
def foo(x):
assert x in huge_global_computation_to_check_all_possible_x_values()
# ok, go ahead and use x...
Run Code Online (Sandbox Code Playgroud)
当然,大多数断言都不是那样,但重要的是要记住你可以做那样的事情.
至于剥离文档字符串,它似乎从一个简单的时间看起来像一个古怪的保留,虽然我想有内存约束的环境,它可以有所作为.
如果你在频繁调用的代码中有断言(例如在内部循环中),剥离它们肯定会产生影响.极端的例子:
$ python -c 'import timeit;print timeit.repeat("assert True")'
[0.088717937469482422, 0.088625192642211914, 0.088654994964599609]
$ python -O -c 'import timeit;print timeit.repeat("assert True")'
[0.029736995697021484, 0.029587030410766602, 0.029623985290527344]
Run Code Online (Sandbox Code Playgroud)
在实际情况中,节省的费用通常会少得多.
剥离文档字符串可能会减小代码的大小,从而减少工作集.
在许多情况下,性能影响可以忽略不计,但与优化一样,唯一可以确定的方法是进行测量.
但是你不需要大量的断言语句才能产生影响吗?您是否有任何值得(并且理智的)代码?
例如,我有一段代码可以获取图中节点之间的路径。我在函数末尾有一个断言语句来检查路径是否不包含重复项:
assert not any(a == b for a, b in zip(path, path[1:]))
Run Code Online (Sandbox Code Playgroud)
我喜欢这个简单的声明在开发过程中带来的安心和清晰。在生产中,代码处理一些大图,这一行可能会占用高达 66% 的运行时间。因此,运行 with-O会显着加快速度。
| 归档时间: |
|
| 查看次数: |
9434 次 |
| 最近记录: |