python list与numpy数组效率对比
作者:强殖装甲凯普 发布时间:2023-08-18 22:49:39
前言
因为经常一训练就是很多次迭代,所以找到效率比较高的操作能大大缩短运行时间,但这方面资料不足,所以自己记录总结一下,有需要再补充
索引效率与内存占用比较
有时候我需要一个数组,然后可能会频繁从中索引数据,那么我选择list还是numpy array呢,这里做了一个简单的实验进行比较,环境python 3.6
import random
import numpy as np
import time
import sys
# import matplotlib
# matplotlib.use('agg')
import matplotlib.pyplot as plt
from collections import deque
start = time.time()
length = []
list_size = []
array_size = []
deque_size = []
list_time = []
array_time = []
deque_time = []
for l in range(5, 15000, 5):
print(l)
length.append(l)
a = [1] * l
b = np.array(a)
c = deque(maxlen=l)
for i in range(l):
c.append(1)
# print('list的size为:{}'.format(sys.getsizeof(a)))
# print('array的size为:{}'.format(sys.getsizeof(b)))
# print('deque的size为:{}'.format(sys.getsizeof(c)))
list_size.append(sys.getsizeof(a))
array_size.append(sys.getsizeof(b))
deque_size.append(sys.getsizeof(c))
for i in range(3):
if i == 0:
tmp = a
name = 'list'
elif i == 1:
tmp = b
name = 'array'
else:
tmp = c
name = 'deque'
s = time.time()
for j in range(1000000):
x = tmp[random.randint(0, len(a)-1)]
duration = time.time() - s
if name == 'list':
list_time.append(duration)
elif name == 'array':
array_time.append(duration)
else:
deque_time.append(duration)
duration = time.time() - start
time_list = [0, 0, 0]
time_list[0] = duration // 3600
time_list[1] = (duration % 3600) // 60
time_list[2] = round(duration % 60, 2)
print('用时:' + str(time_list[0]) + ' 时 ' + str(time_list[1]) + '分' + str(time_list[2]) + '秒')
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.plot(length, list_size, label='list')
ax1.plot(length, array_size, label='array')
ax1.plot(length, deque_size, label='deque')
plt.xlabel('length')
plt.ylabel('size')
plt.legend()
ax2 = fig.add_subplot(212)
ax2.plot(length, list_time, label='list')
ax2.plot(length, array_time, label='array')
ax2.plot(length, deque_time, label='deque')
plt.xlabel('length')
plt.ylabel('time')
plt.legend()
plt.show()
对不同大小的list,numpy array和deque进行一百万次的索引,结果为
可以看出,numpy array对内存的优化很好,长度越大,其相比list和deque占用内存越少。
list比deque稍微好一点。因此如果对内存占用敏感,选择优先级:numpy array>>list>deque。
时间上,在15000以下这个长度,list基本都最快。其中
长度<1000左右时,deque跟list差不多,选择优先级:list≈ \approx≈deque>numpy array;
长度<9000左右,选择优先级:list>deque>numpy array;
长度>9000左右,选择优先级:list>numpy array>deque;
不过时间上的差距都不大,几乎可以忽略,差距主要体现在内存占用上。因此如果对内存不敏感,list是最好选择。
整个实验使用i7-9700,耗时2.0 时 36.0分20.27秒,如果有人愿意尝试更大的量级,更小的间隔,欢迎告知我结果。
添加效率比较
numpy的数组没有动态改变大小的功能,因此这里numpy数据只是对其进行赋值。
import numpy as np
import time
from collections import deque
l = 10000000
a = []
b = np.zeros(l)
c = deque(maxlen=l)
for i in range(3):
if i == 0:
tmp = a
name = 'list'
elif i == 1:
tmp = b
name = 'array'
else:
tmp = c
name = 'deque'
start = time.time()
if name == 'array':
for j in range(l):
tmp[j] = 1
else:
for j in range(l):
tmp.append(1)
duration = time.time() - start
time_list = [0, 0, 0]
time_list[0] = duration // 3600
time_list[1] = (duration % 3600) // 60
time_list[2] = round(duration % 60, 2)
print(name + '用时:' + str(time_list[0]) + ' 时 ' + str(time_list[1]) + '分' + str(time_list[2]) + '秒')
结果为:
list用时:0.0 时 0.0分1.0秒
array用时:0.0 时 0.0分1.14秒
deque用时:0.0 时 0.0分0.99秒
可以看出,只有在非常大的量级上才会出现区别,numpy array的赋值是最慢的,list和deque差不多。
但平时这些差距几乎可以忽略。
来源:https://blog.csdn.net/qq_38163755/article/details/109392728


猜你喜欢
- 背景App落地页迭代频繁,且需兼容App与各小App,目前是单向前进迭代,会存在以下问题:跳转原生交互;如:某个落地页增加了只有主App的才
- 1.random.random():会随机生成0-1之间的小数例如:2.random.uniform(min,max):会随机生成 min
- 昨天我只是将数据库附加到SQL2012,然后各个数据库都做了收缩事务日志的操作兼容级别这些都没有改再附加回SQL2005的时候就报错在SQL
- 问题背景两张表一张是用户表a(主键是int类型),一张是用户具体信息表b(用户表id字段是varchar类型)。因为要显示用户及用户信息,所
- Django View官方文档一个视图函数(类),简称视图,是一个简单的 Python 函数(类),它接受Web请求并且返回Web响应。响应
- 本文实例讲述了mysql语句实现简单的增、删、改、查操作。分享给大家供大家参考,具体如下:1、创建db_shop数据库,如果该数据库不存在则
- 1. 需求概述最近接到一份PDF资料需要打印,奈何页面是如图所示的A3格式的,奈何目前条件只支持打印A4。我想要把每页的一个大页面裁成两个小
- 由于最近在处理shp文件,想要跳出arcpy的限制,所以打算学习一下pyshp包的使用方法。在使用《Python地理空间分析指南(第2版)》
- 本文译文,采用意译。下面这些方法对于我来说很有作用,自从我发现了这些操作。1. 数组求和假设你有下面的数字数组:let numbers =
- 使用了pandas的Series方法绘制图像体验之后感觉直接用matplotlib的功能好用了不少,又试用了DataFrame的方法之后发现
- delete WeiBoTopics where Id in(select max(Id) from WeiBoTopics group b
- 在MySQL中,使用While语句循环与SQL Server中有所不同,代码测试通过。 MSSQL中使用while语句循环生成数据的方法:
- 本文实例为大家分享了python画条形图的具体代码,供大家参考,具体内容如下在做毕设的过程中有些数据用表格来展现,会很难看出数据之间的差别,
- python版本为python3.51.要求1)输入用户名密码2)认证成功后显示欢迎信息3)输错三次后锁定2.需求分析1)用户信息存储在文件
- 本文列举了所有关于PHP语言中使用socket相关服务的一些函数。注意使用如下函数之前,你需要确保你的socket已打开,如果你没有打开,请
- Python是很好的爬虫工具不用再说了,它可以满足我们爬取网络内容的需求,那最简单的爬取网络上的图片,可以通过很简单的方法实现。只需导入正则
- 问:如何让内联框架里面的网页背景透明?(用iframe嵌套一网页,怎么能够设置其背景为透明以便能显示父框架中网页的背景图?)答:这是需要 I
- 好了,看看我们的代码吧:upload.htm' 上传页面<html> <body>&nb
- 本文实例讲述了Python操作列表常用方法。分享给大家供大家参考,具体如下:使用for循环,遍历整个列表依次从列表中取出元素,存放到name
- 本文较为详细的分析了python内存管理机制。分享给大家供大家参考。具体分析如下:内存管理,对于Python这样的动态语言,是至关重要的一部