Python黑魔法手册 2.0 文档第一章【13-16】

Python黑魔法手册

第一章:魔法冷知识【13-16】

1.13 site-packages和 dist-packages

如果你足够细心,你会在你的机器上,有些包是安装在 site-packages 下,而有些包安装在
dist-packages 下。

它们有什么区别呢?

一般情况下,你只见过 site-packages 这个目录,而你所安装的包也将安装在 这个目录下。
而 dist-packages 其实是 debian 系的 Linux 系统(如 Ubuntu)才特有的目录,当你使用 apt
去安装的 Python 包会使用 dist-packages,而你使用 pip 或者 easy_install 安装的包还是照常
安装在 site-packages 下。
Debian 这么设计的原因,是为了减少不同来源的 Python 之间产生的冲突。
如何查找 Python 安装目录

>>> from distutils.sysconfig import get_python_lib
>>> print(get_python_lib())
/usr/lib/python2.7/site-packages

1.14 argument 和 parameter 的区别?

arguments 和 parameter 的翻译都是参数,在中文场景下,二者混用基本没有问题,毕竟都
叫参数嘛。
/
但若要严格再进行区分,它们实际上还有各自的叫法
parameter:形参(formal parameter),体现在函数内部,作用域是这个函数体。
argument :实参(actual parameter),调用函数实际传递的参数。
举个例子,如下这段代码, “error” 为 argument,而 msg 为 parameter

def output_msg(msg):
 print(msg)
output_msg("error")

1.15 /usr/bin/env python 有什么用?

我们经常会在别人的脚本或者项目的入口文件里看到第一行是下面这样

#!/usr/bin/python

或者这样

sh e llsh el #!/usr/bin/env python

这两者有什么区别呢?

稍微接触过 linux 的人都知道 /usr/bin/python 就是我们执行 python 进入console 模式里的
python

Python黑魔法手册 2.0 文档第一章【13-16】

而当你在可执行文件头里使用 #! + /usr/bin/python ,意思就是说你得用哪个软件
(python)来执行这个文件。
那么加和不加有什么区别呢?
不加的话,你每次执行这个脚本时,都得这样: python xx.py

Python黑魔法手册 2.0 文档第一章【13-16】

有没有一种方式?可以省去每次都加 python 呢?
当然有,你可以文件头里加上 #!/usr/bin/python ,那么当这个文件有可执行权限 时,只直接
写这个脚本文件,就像下面这样。

Python黑魔法手册 2.0 文档第一章【13-16】

明白了这个后,再来看看 !/usr/bin/env python 这个 又是什么意思 ?
当我执行 env python 时,自动进入了 python console 的模式

Python黑魔法手册 2.0 文档第一章【13-16】

这是为什么?和 直接执行 python 好像没什么区别呀
当你执行 env python 时,它其实会去 env | grep PATH 里(也就是
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin )这几个路径里去依次查找名为
python的可执行文件。
找到一个就直接执行,上面我们的 python 路径是在 /usr/bin/python 里,在 PATH 列表里倒
数第二个目录下,所以当我在 /usr/local/sbin 下创建一个名字也为 python 的可执行文件
时,就会执行 /usr/bin/python 了。
具体演示过程,你可以看下面。

Python黑魔法手册 2.0 文档第一章【13-16】

那么对于这两者,我们应该使用哪个呢?
个人感觉应该优先使用 #!/usr/bin/env python ,因为不是所有的机器的 python 解释器都是
/usr/bin/python

1.16 dict() 与 {} 生成空字典有什么区别?

在初始化一个空字典时,有的人会写 dict(),而有的人会写成 {}
很多人会想当然的认为二者是等同的,但实际情况却不是这样的。
在运行效率上,{} 会比 dict() 快三倍左右。
使用timeit模块,可以轻松测出这个结果

$ python -m timeit -n 1000000 -r 5 -v "dict()"
raw times: 0.0996 0.0975 0.0969 0.0969 0.0994
1000000 loops, best of 5: 0.0969 usec per loop
$
$ python -m timeit -n 1000000 -r 5 -v "{}"
raw times: 0.0305 0.0283 0.0272 0.03 0.0317
1000000 loops, best of 5: 0.0272 usec per loop

那为什么会这样呢?
探究这个过程,可以使用 dis 模块
当使用 {} 时:

$ cat demo.py
{}
$
$ python -m dis demo.py
 1 0 BUILD_MAP 0
 2 POP_TOP
 4 LOAD_CONST 0 (None)
 6 RETURN_VALUE

当使用 dict() 时:

$ cat demo.py
dict()
$
$ python -m dis demo.py
 1 0 LOAD_NAME 0 (dict)
 2 CALL_FUNCTION 0
 4 POP_TOP
 6 LOAD_CONST 0 (None)
 8 RETURN_VALUE

可以发现使用 dict(),会多了个调用函数的过程,而这个过程会有进出栈的操作,相对更加耗时。

版权声明:safedragon 发表于 2022-09-05 19:08:32。
转载请注明:Python黑魔法手册 2.0 文档第一章【13-16】 | 网址导航

暂无评论

暂无评论...