大富豪@python

なんか最近書いているPythonコードが異常にメモリを食ってた。調べてみると適当に二次元配列作ってる部分がやばいらしい

いくつかの方法で二次元配列を作ってメモリ使用量を比較。

import sys
from resource import *
from numpy import *

import gc
gc.disable()

N = 2000

sz0 = (float( getrusage(RUSAGE_SELF)[6]*getpagesize() )/(1024*1024*1024))

####
as = dict()
for i in xrange(N):
   for j in xrange(N):
     as[(i,j)] = True

sz1 = (float( getrusage(RUSAGE_SELF)[6]*getpagesize() )/(1024*1024*1024))


####
bs = dict()
for i in xrange(N):
   bs[i] = dict()
   for j in xrange(N):
     bs[i][j] = True

sz2 = (float( getrusage(RUSAGE_SELF)[6]*getpagesize() )/(1024*1024*1024))

####
cs = [[True for i in xrange(N)] for j in xrange(N)]
sz3 = (float( getrusage(RUSAGE_SELF)[6]*getpagesize() )/(1024*1024*1024))


####
ds = zeros((N,N) , dtype=bool)
sz4 = (float( getrusage(RUSAGE_SELF)[6]*getpagesize() )/(1024*1024*1024))

print "%f[GB],%f[GB],%f[GB],%f[GB]" % ((sz1-sz0),(sz2-sz1),(sz3-sz2),(sz4-sz3))

実行結果

0.736668[GB],0.454918[GB],0.030876[GB],0.003723[GB]

一桁くらいずつの違いが。実際に走らせているコードでは、Nが10万超えることがあるので、75GBくらいメモリを使ってるやつがいる。なんという大富豪プログラミング。