
304
|
第十一章
我們可以使用
memit
看看行程的增長情形,驗證這個估計。在此案例中,數字非常
接近︰
In [2]: %memit([x for x in xrange(10000000)])
peak memory: 330.64 MiB, increment: 310.62 MiB
通常,
asizeof
比
memit
慢,然而,在你分析小物件時,
asizeof
會是有用的。
memit
或
許對現實世界的應用程式比較有用,因為行程的實際記憶體使用量被量測,而不是被
推斷。
位元組 vs. Unicode
切換到 Python 3.3+ 的一個必要理由就是:它的 Unicode 物件儲存遠比 Python 2.7 經濟
許多。如果你的主要工作是處理大量的字串,而且它們耗用了大量的 RAM,請務必考
慮使用 Python 3.3+,你會自動省下龐大的 RAM。
在範例 11-7 中,可以看到,100,000,000 個字元的序列被建構為位元組群集(同 Python
2.7 的
str
)以及 Unicode 物件。Unicode 版本多花了 4 倍的 RAM,每個 Unicode 字元耗
費了相同的較高代價,不管描述底層資料所需的位元組數量為何。
範例
11-7 Unicode
物件在
Python 2.7
中相當昂貴
In [1]: %load_ext memory_profiler
In [2]: %memit b"a" * int(1e8)
peak memory: 100.98 MiB, increment: 80.97 ...