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
猜你喜欢
- 在python 开发web程序时,需要调用第三方的相关接口,在调用时,需要对请求进行签名。需要用到unix时间戳。 在python里,在网上
- 1,模块命名(1)模块推荐使用小写命名,(2)除非有很多字母,尽量不要用下划线因为很多模块文件存与模块名称一致的类,模块采用小写,类采用首字
- 直接分析,如原矩阵如下(1): (1) 我们要截取的矩阵(取其一三行,和三四列数据构成矩阵)为如下(2): (2)错
- 一.正常运行:咱们随便写个文件:# test.pyimport argparseap = argparse.ArgumentParser()
- 参考Tensorflow Machine Leanrning Cookbooktf.ConfigProto()主要的作用是配置tf.Sess
- 本文实例讲述了PHP+redis实现添加处理投票的方法。分享给大家供大家参考,具体如下:<?php header("Cont
- 在CSS森林群里讨论一个margin的问题中无意间发现overflow也可以用来清除浮动,嘿嘿,这个方法不单使用简单,而且FF、OP、IE7
- 本篇阅读的代码片段来自于30-seconds-of-python。1. count_bydef count_by(arr, fn=lambd
- Django上传文件最简单最官方的方法1.配置media路径在settings.py中添加如下代码:MEDIA_ROOT =&nb
- 我们平时生活的娱乐中,看电影是大部分小伙伴都喜欢的事情。周围的人总会有意无意的在谈论,有什么影片上映,好不好看之类的话题,没事的时候谈论电影
- 一、requests库requests是使用Apache2 licensed 许可证的HTTP库。比urllib模块更简洁。Request支
- 上篇文章给大家介绍了Python爬虫实现百度翻译功能过程详解Python爬虫学习之翻译小程序 感兴趣的朋友点击查看。今天给大家介
- 本文实例讲述了Python面向对象之多态原理与用法。分享给大家供大家参考,具体如下:目标多态面向对象三大特性封装 根据 职责 将 属性 和
- 首先,大家先去下载一份dvbbs.php beta1的代码,解压后先抛开php代码,找出你的mysql手册,如果没有手册那么就直接看下面的实
- 服务器之间的http数据传输直接使用python内置的http服务:python -m SimpleHTTPServer 8000此时,输入
- 有的小伙伴对于枚举的理解很模糊,其实我们可以把它看成一个数量的大管家,对其中的每一个数进行检查,保证里面的数字都没有重复的,这就是枚举的用法
- 前言提示:这里可以添加本文要记录的大概内容:公司里B2B是通过WinSCP里SFTP与客户进行数据传输,WinSCP是一个Windows环境
- 在制作表单的时候,我们往往用CSS来重新定义表单元素(如输入框、按钮等)的样式,以便看起来更加美观。而表单中的很多不同元素(如输入框、提交按
- 我就废话不多说了,还是直接看代码吧def c(a,b): c=a**2+b**2 return ("the right trian
- 由于javascript是一种无类型语言,所以一个数组的元素可以具有任意的数据类型,同一个数组的不同元素可以具有不同的类型,数组的元素设置可