我用%memit
神奇的功能來衡量內存使用:內存使用:創建一個大集VS合併許多小套
In [1]: %memit n = pow(10, 7); range(n)
peak memory: 568 MiB, increment: 272 MiB
In [2]: %memit n = pow(10, 7); set(xrange(n))
peak memory: 824 MiB, increment: 447 MiB
行,所以似乎有哪裏xrange(n)
實例化爲一個完整列表的一箇中間步驟。但是如果我把我的列表切成10個子列表並將它們一個一個地聯合起來呢?這會更有效率的記憶,對嗎?
In [3]: %memit n = pow(10, 7); reduce(set.union, (set(xrange(p, n, 10)) for p in range(10)))
peak memory: 1260 MiB, increment: 897 MiB
那麼,這並沒有如預期那樣。爲什麼reduce
方法比set(xrange(n))
消耗更多內存?
相關問題:http://stackoverflow.com/questions/15198042/why-does-union-consume-more-memory-if-the-argument-is-a-set請注意,'set.union'將使用**如果參數是一個集合,則爲更多**內存,因爲它假定將會有少量通用元素,因此它將分配所需內存的兩倍。 – Bakuriu