cat /proc/meminfo
内存总计:3981272 kB
我用python运行了这个简单的测试
#!/usr/bin/env python
import sys
num = int(sys.argv[1])
li = []
for i in xrange(num):
li.append(i)
$ time ./listappend.py 1000000
real 0m0.342s
user 0m0.304s
sys 0m0.036s
$ time ./listappend.py 2000000
real 0m0.646s
user 0m0.556s
sys 0m0.084s
$ time ./listappend.py 4000000
real 0m1.254s
user 0m1.136s
sys 0m0.116s
$ time ./listappend.py 8000000
real 0m2.424s
user 0m2.176s
sys 0m0.236s
$ time ./listappend.py 16000000
real 0m4.832s
user 0m4.364s
sys 0m0.452s
$ time ./listappend.py 32000000
real 0m9.737s
user 0m8.637s
sys 0m1.028s
$ time ./listappend.py 64000000
real 0m56.296s
user 0m17.797s
sys 0m3.180s
问题:
比之前的六百六十万倍翻了一番。为什么?在
根据effbot:
(我的重点)。在
当您向列表添加更多项时,reallocator将尝试保留更大的内存量。一旦您用完了所有的物理内存(RAM),并且您的操作系统开始使用交换空间,数据从磁盘到RAM的洗牌(反之亦然)将使您的程序非常缓慢。在
我用不同大小的盒子运行程序。这是结果
^{pr2}$User time
程序以用户身份运行的时间。(运行用户逻辑)System time
程序作为系统执行的时间。(即系统调用所花费的时间)Elapsed time
程序执行的总时间。(包括等待时间….)当内存页不在RAM中时发生
Major Page Fault
必须从辅助设备(如硬盘)中获取。16M列表大小:列表大部分在内存中。因此没有页面错误。
正如unutbu指出的,python解释器在列表增长时为列表分配一个
O(n*n)
额外空间,这种情况只会恶化。在我强烈怀疑您的Python进程耗尽了可用的物理RAM,并开始交换到磁盘。在
重新运行上一个测试,同时注意内存使用情况和/或页面错误数。在
相关问题 更多 >
编程相关推荐