当预计最终数组的大小不会超出5000x10时,采用预分配一个最大尺寸的数组,并通过循环逐步填充数据,之后使用arr.resize()
方法根据实际需要调整数组大小,是一种有效的方法。
这种方法不仅能够避免因频繁扩展数组而导致的性能下降,还能在最终确定数组大小后释放未使用的内存,从而实现更优的内存管理。
与直接使用Python列表构建中间结果再转换为Numpy数组相比,这种预分配和调整大小的方法在处理大规模数据时表现出了显著的性能优势和更低的内存占用。
以下是具体的性能对比测试结果:
对于不同规模的数据集,使用两种不同的方法进行测试:
- 使用
numpy_all_the_way
方法(预分配和调整大小) - 使用
python_lists_to_array
方法(先构建列表再转换)
测试代码如下:
import numpy as np
import os
def memory_usage():
pid = os.getpid()
with open(f'/proc/{pid}/status') as f:
for line in f:
if line.startswith('VmSize'):
return int(line.split()[1])
N, M = 5000, 10
def python_lists_to_array(k):
list_of_arrays = [x * np.ones(M) for x in range(k)]
arr = np.array(list_of_arrays)
return arr
def numpy_all_the_way(k):
arr = np.empty((N, M))
for x in range(k):
arr[x] = x * np.ones(M)
arr.resize((k, M))
return arr
if __name__ == '__main__':
print(f'Initial memory usage: {memory_usage()}')
arr = python_lists_to_array(5000)
print(f'After python_lists_to_array: {memory_usage()}')
arr = numpy_all_the_way(5000)
print(f'After numpy_all_the_way: {memory_usage()}')
测试结果显示,无论是执行时间还是内存使用情况,numpy_all_the_way
方法都优于python_lists_to_array
方法,特别是在处理较大规模数据集时,性能提升尤为明显。