热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PythonNumpy数组创建技巧:从列表到高效Numpy数组转换

本文探讨了在已知最终数组尺寸不会超过5000x10的情况下,如何利用预分配和调整大小的方法来优化Numpy数组的创建过程,以提高性能并减少内存消耗。

当预计最终数组的大小不会超出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方法,特别是在处理较大规模数据集时,性能提升尤为明显。


推荐阅读
author-avatar
属于小草的树洞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有