神奇的 intern 機(jī)制
字符串類型作為Python中最常用的數(shù)據(jù)類型之一,Python解釋器為了提高字符串使用的效率和使用性能,做了很多優(yōu)化。
例如:Python解釋器中使用了 intern(字符串駐留)的技術(shù)來(lái)提高字符串效率,什么是intern機(jī)制?就是同樣的字符串對(duì)象僅僅會(huì)保存一份,放在一個(gè)字符串儲(chǔ)蓄池中,是共用的,當(dāng)然,肯定不能改變,這也決定了字符串必須是不可變對(duì)象。
>>> s1="hello"
>>> s2="hello"
>>> s1 is s2
True
# 如果有空格,默認(rèn)不啟用intern機(jī)制
>>> s1="hell o"
>>> s2="hell o"
>>> s1 is s2
False
# 如果一個(gè)字符串長(zhǎng)度超過(guò)20個(gè)字符,不啟動(dòng)intern機(jī)制
>>> s1 = "a" * 20
>>> s2 = "a" * 20
>>> s1 is s2
True
>>> s1 = "a" * 21
>>> s2 = "a" * 21
>>> s1 is s2
False
>>> s1 = "ab" * 10
>>> s2 = "ab" * 10
>>> s1 is s2
True
>>> s1 = "ab" * 11
>>> s2 = "ab" * 11
>>> s1 is s2
False
site-packages和 dist-packages
如果你足夠細(xì)心,你會(huì)在你的機(jī)器上,有些包是安裝在 site-packages 下,而有些包安裝在 dist-packages 下。
它們有什么區(qū)別呢?
一般情況下,你只見(jiàn)過(guò) site-packages 這個(gè)目錄,而你所安裝的包也將安裝在這個(gè)目錄下。
而 dist-packages 其實(shí)是 debian 系的 Linux 系統(tǒng)(如 Ubuntu)才特有的目錄,當(dāng)你使用 apt 去安裝的 Python 包會(huì)使用 dist-packages,而你使用 pip 或者 easy_install 安裝的包還是照常安裝在 site-packages 下。
Debian 這么設(shè)計(jì)的原因,是為了減少不同來(lái)源的 Python 之間產(chǎn)生的沖突。
如何查找 Python 安裝目錄
>>> from distutils.sysconfig import get_python_lib
>>> print(get_python_lib())
/usr/lib/python2.7/site-packages
argument 和 parameter 的區(qū)別
arguments 和 parameter 的翻譯都是參數(shù),在中文場(chǎng)景下,二者混用基本沒(méi)有問(wèn)題,畢竟都叫參數(shù)嘛。
但若要嚴(yán)格再進(jìn)行區(qū)分,它們實(shí)際上還有各自的叫法
parameter:形參(formal parameter),體現(xiàn)在函數(shù)內(nèi)部,作用域是這個(gè)函數(shù)體。
argument :實(shí)參(actual parameter),調(diào)用函數(shù)實(shí)際傳遞的參數(shù)。
舉個(gè)例子,如下這段代碼,"error"
為 argument,而 msg 為 parameter
。
def output_msg(msg):
print(msg)
output_msg("error")
dict() 與 {} 生成空字典有什么區(qū)別
在初始化一個(gè)空字典時(shí),有的人會(huì)寫 dict(),而有的人會(huì)寫成 {}
很多人會(huì)想當(dāng)然的認(rèn)為二者是等同的,但實(shí)際情況卻不是這樣的。
在運(yùn)行效率上,{} 會(huì)比 dict() 快三倍左右。
使用 timeit 模塊,可以輕松測(cè)出這個(gè)結(jié)果
$ 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
那為什么會(huì)這樣呢?
探究這個(gè)過(guò)程,可以使用 dis 模塊
當(dāng)使用 {} 時(shí)
$ cat demo.py
{}
$
$ python -m dis demo.py
1 0 BUILD_MAP 0
2 POP_TOP
4 LOAD_CONST 0 (None)
6 RETURN_VALUE
當(dāng)使用 dict() 時(shí):
$ 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
可以發(fā)現(xiàn)使用 dict(),會(huì)多了個(gè)調(diào)用函數(shù)的過(guò)程,而這個(gè)過(guò)程會(huì)有進(jìn)出棧的操作,相對(duì)更加耗時(shí)。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6817瀏覽量
88743 -
字符串
+關(guān)注
關(guān)注
1文章
575瀏覽量
20470 -
python
+關(guān)注
關(guān)注
55文章
4768瀏覽量
84376
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論