python - 为Python中的列表保留内存?

标签 python performance arrays memory-management list

在 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/

相关文章:

python - python如何在Windows上右键单击访问文件

.net - System.Activator.CreateInstance(T) 是否存在足以阻止我们随意使用它的性能问题?

mysql - 150 个 tinyint 或 1 个 varchar(300)?

Java:如何制作一个创建数组的循环?

python - 寻找多个县之间最大的人口差异?

python - 为什么这个python autobahn代码需要使用 'yield'关键字?

python - Micropython 或最小 python 安装

python - 服务器端谷歌标记聚类 - Python/Django

android - 收到错误的android google play安装Referrer

javascript - JS 数组中输入标签集的值