簡體   English   中英

使用稀疏數據的列表消耗的內存少於與numpy數組相同的數據

[英]List with sparse data consumes less memory then the same data as numpy array

我正在使用非常高維度的向量進行機器學習,並且正在考慮使用numpy來減少使用的內存量。 我運行一個快速測試,看看我可以使用numpy(1)(3)節省多少內存:

標准清單

import random
random.seed(0)
vector = [random.random() for i in xrange(2**27)]

Numpy數組

import numpy
import random
random.seed(0)
vector = numpy.fromiter((random.random() for i in xrange(2**27)), dtype=float)

內存使用情況(2)

Numpy array: 1054 MB
Standard list: 2594 MB

就像我預期的那樣。

通過使用本機浮點數分配一個連續的內存塊numpy只消耗標准列表正在使用的內存的大約一半。

因為我知道我的數據非常多,所以我使用稀疏數據進行了相同的測試。

標准清單

import random
random.seed(0)
vector = [random.random() if random.random() < 0.00001 else 0.0 for i in xrange(2 ** 27)]

Numpy數組

from numpy import fromiter
from random import random
random.seed(0)
vector = numpy.fromiter((random.random() if random.random() < 0.00001 else 0.0 for i in xrange(2 ** 27)), dtype=float)

內存使用情況(2)

Numpy array: 1054 MB
Standard list: 529 MB

現在突然間,python列表使用了numpy數組使用的內存量的一半! 為什么?

我能想到的一件事是,當python檢測到它包含非常稀疏的數據時,它會動態切換到dict表示。 檢查這可能會增加很多額外的運行時間開銷,所以我真的不認為這是在繼續。

筆記

  1. 我為每個測試開始了一個全新的python shell。
  2. 記憶用htop測量。
  3. 在32位Debian上運行。

Python列表只是Python對象的引用(指針)數組。 在CPython(通常的Python實現)中,列表稍微過度分配以使擴展更有效,但它永遠不會轉換為dict。 有關更多詳細信息,請參閱源代碼: 列出對象實現

在列表的稀疏版本中,您有許多指向單個int 0對象的指針。 這些指針占用32位= 4個字節,但你的numpy浮點肯定更大,可能是64位。

FWIW,為了使稀疏列表/數組測試更准確,你應該在兩個版本中使用相同的種子調用random.seed(some_const) ,以便在Python列表和numpy數組中獲得相同數量的零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM