在 Python 中编程时,是否可以为将填充已知数量项目的列表保留内存,以便在构建时不会多次重新分配列表?我查看了 Python 列表类型的文档,但没有找到任何似乎可以做到这一点的东西。但是,这种类型的列表构建会出现在我的代码的一些热点中,所以我想尽可能提高它的效率。
编辑:另外,用 Python 这样的语言做这样的事情是否有意义?我是一个相当有经验的程序员,但对 Python 很陌生,并且仍然对它的做事方式有所了解。 Python 是否在内部将所有对象分配在单独的堆空间中,从而违背了尝试最小化分配的目的,还是将 int、float 等原语直接存储在列表中?
最佳答案
这里有四种变体:
- 增量列表创建
- “预分配”列表
- array.array()
- numpy.zeros()
python -mtimeit -s"N=10**6" "a = []; app = a.append;"\
"for i in xrange(N): app(i);"
10 loops, best of 3: 390 msec per loop
python -mtimeit -s"N=10**6" "a = [None]*N; app = a.append;"\
"for i in xrange(N): a[i] = i"
10 loops, best of 3: 245 msec per loop
python -mtimeit -s"from array import array; N=10**6" "a = array('i', [0]*N)"\
"for i in xrange(N):" " a[i] = i"
10 loops, best of 3: 541 msec per loop
python -mtimeit -s"from numpy import zeros; N=10**6" "a = zeros(N,dtype='i')"\
"for i in xrange(N):" " a[i] = i"
10 loops, best of 3: 353 msec per loop
这表明 [None]*N
在这种情况下是最快的,而 array.array
是最慢的。
关于python - 为Python中的列表保留内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/537086/