当前位置:  开发笔记 > 编程语言 > 正文

在Python中为列表保留内存?

如何解决《在Python中为列表保留内存?》经验,为你挑选了4个好方法。

在使用Python编程时,是否可以为将填充已知数量的项目的列表保留内存,以便在构建列表时不会多次重新分配列表?我查看了文档中的Python列表类型,但没有找到任何似乎这样做的东西.但是,这种类型的列表构建显示在我的代码的几个热点中,所以我想尽可能高效.

编辑:另外,用像Python这样的语言做这样的事情是否有意义?我是一个相当有经验的程序员,但是对Python很陌生并且仍然对它的做事方式有所了解.Python是否在内部将所有对象分配到单独的堆空间中,从而无法尝试最小化分配,或者是直接存储在列表中的诸如整数,浮点数等原语?



1> jfs..:

这里有四种变体:

增量列表创建

"预先分配"清单

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在这种情况下是最慢的.


@MattKrause:不包含`import`,请注意`-s`
这对于numpy和数组似乎有点不公平,因为你包含了导入时间,这可能会在很多调用中分摊.@ MikhailKorobov的结果似乎表明,一旦进口,numpy要快得多.

2> SilentGhost..:

您可以创建已知长度的列表,如下所示:

>>> [None] * known_number



3> Mikhail Koro..:

看看这个:

In [7]: %timeit array.array('f', [0.0]*4000*1000)
1 loops, best of 3: 306 ms per loop

In [8]: %timeit array.array('f', [0.0])*4000*1000
100 loops, best of 3: 5.96 ms per loop

In [11]: %timeit np.zeros(4000*1000, dtype='f')
100 loops, best of 3: 6.04 ms per loop

In [9]: %timeit [0.0]*4000*1000
10 loops, best of 3: 32.4 ms per loop

所以不要使用array.array('f', [0.0]*N),使用array.array('f', [0.0])*Nnumpy.zeros.


如果您要设置数组元素而不是添加它们,则可能不需要零,只需要为每个元素保留一些空间.在这种情况下,要走的路是`np.empty`来代替`np.zeros`.通过测试,我的计算机速度提高了三倍.

4> Alexander Le..:

在大多数日常代码中,您不需要这样的优化.

但是,当列表效率成为一个问题时,您应该做的第一件事是用array模块中的类型化替换泛型列表,这样更有效.

以下是如何创建400万个浮点数的列表:

import array
lst = array.array('f', [0.0]*4000*1000)


在这种情况下,它甚至首先创建一个列表,然后从列表中创建一个数组.这效率不高.
"效率更高"是什么意思?`array.array`可能需要更少的内存,但Python列表在大多数情况下(意味着我已经尝试过)的情况更快.
推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有