当前位置:网站首页>numpy数组访问的效率研究
numpy数组访问的效率研究
2022-07-21 15:25:00 【风华明远】
1.简介
numpy数组如何访问比较高效?使用numpy提供的方法,还是自定义方法?如果数组很大,毫无疑问使用numpy提供的方法最高效。本文研究了查找numpy最大值、最小值、四则运算、特定值查找等4种情况。
2.最大值和最小值
numpy提供了数组最大值和最小的方法,分别是max和min。数组是一维的,从1个元素一直到500个元素。数组是随机生成的,查找的次数为1000次。
代码如下:
#coding:utf8
import numpy as np
import timeit
import matplotlib.pyplot as plt
def my_max(H):
r = -9223372036854775808 # int64 最小值
for i in range(H.shape[0]):
if H[i]>r:
r = H[i]
return r
def my_min(H):
r = 9223372036854775807 # int64最大值
for i in range(H.shape[0]):
if H[i]<r:
r = H[i]
return r
def np_max(H):
return np.max(H)
def np_min(H):
return np.min(H)
if __name__ == '__main__':
array = 300
H = np.random.randint(100, 1000000, array)
x = np.arange(1,array+1)
npmin = []
mymin = []
npmax = []
mymax = []
times = 1000
for i in range(1,array+1):
K = H[0:i]
npmin.append(timeit.timeit("np_min(K)", setup="from __main__ import np_min",number=times,globals=globals()))
mymin.append(timeit.timeit("my_min(K)", setup="from __main__ import my_min", number=times, globals=globals()))
npmax.append(timeit.timeit("np_max(K)", setup="from __main__ import np_min",number=times,globals=globals()))
mymax.append(timeit.timeit("my_max(K)", setup="from __main__ import my_min", number=times, globals=globals()))
plt.plot(x,npmin,color='red')
plt.plot(x,mymin,color='green')
plt.plot(x,npmax, color='blue')
plt.plot(x,mymax, color='black')
plt.show()
结论:
(1)numpy的方法o(1)的。并没有随着数组元素增多而线性增长
(2)自定义方法是o(n)的
(3)自定义的max方法比min方法要速度快一点点。估计是交换的次数少一些。
3.四则运算
四则运算包括numpy数组与常数的四则运算,以及numpy数组与同shape的numpy数组的四则运算。
3.1 numpy数组与常数的四则运算
与查找最大值、最小值类似,用numpy自带的方法进行四则运算效率更高。代码中的拷贝数组不是必须的,要看实际的实现情况。
代码中分别实现了加法和乘法的情形,因为减法和除法与加法和乘法在实现方法上是没有区别的。
#coding:utf8
import numpy as np
import timeit
import matplotlib.pyplot as plt
def my_add(K,value):
H = np.array(K)
for i in range(H.shape[0]):
H[i] += value
return H
def my_times(K,value):
H = np.array(K)
for i in range(H.shape[0]):
H[i] *= value
return H
def np_add(K,value):
H = np.array(K)
return H+value
def np_times(K,value):
H = np.array(K)
return H*value
if __name__ == '__main__':
array = 300
H = np.random.random(array)
x = np.arange(1,array+1,dtype=np.uint16)
times = 1000
npadd=[]
myadd=[]
nptimes=[]
mytimes=[]
for i in range(1, array + 1):
K = H[0:i]
npadd.append(timeit.timeit("np_add(K,20.)", setup="from __main__ import np_add", number=times, globals=globals()))
myadd.append(timeit.timeit("my_add(K,20.)", setup="from __main__ import my_add", number=times, globals=globals()))
nptimes.append(timeit.timeit("np_times(K,20.)", setup="from __main__ import np_times",number=times,globals=globals()))
mytimes.append(timeit.timeit("my_times(K,20.)", setup="from __main__ import my_times", number=times, globals=globals()))
plt.plot(x,npadd,color='red')
plt.plot(x,myadd,color='green')
plt.plot(x,nptimes, color='blue')
plt.plot(x,mytimes, color='black')
plt.show()
3.2 数组与数组的四则运算
数组与数组和数组与常数的四则运算耗时是差别不大的。这是因为耗时主要体现在数组循环上,而不是在四则运算上。
# coding:utf8
import numpy as np
import timeit
import matplotlib.pyplot as plt
def my_add(K, value):
H = np.array(K)
for i in range(H.shape[0]):
H[i] += value[i]
return H
def my_times(K, value):
H = np.array(K)
for i in range(H.shape[0]):
H[i] *= value[i]
return H
def np_add(K, value):
H = np.array(K)
return H + value
def np_times(K, value):
H = np.array(K)
return H * value
if __name__ == '__main__':
array = 300
H = np.random.random(array)
V = np.random.random(array)
x = np.arange(1, array + 1, dtype=np.uint16)
times = 1000
npadd = []
myadd = []
nptimes = []
mytimes = []
for i in range(1, array + 1):
K = H[0:i]
W = V[0:i]
npadd.append(
timeit.timeit("np_add(K,W)", setup="from __main__ import np_add", number=times, globals=globals()))
myadd.append(
timeit.timeit("my_add(K,W)", setup="from __main__ import my_add", number=times, globals=globals()))
nptimes.append(
timeit.timeit("np_times(K,W)", setup="from __main__ import np_times", number=times, globals=globals()))
mytimes.append(
timeit.timeit("my_times(K,W)", setup="from __main__ import my_times", number=times, globals=globals()))
plt.plot(x, npadd, color='red')
plt.plot(x, myadd, color='green')
plt.plot(x, nptimes, color='blue')
plt.plot(x, mytimes, color='black')
plt.show()
4. 特定值查找
特定值查找是在数组中找到指定的数值。
# coding:utf8
import numpy as np
import timeit
import matplotlib.pyplot as plt
def my_find(K, value):
for i in range(K.shape[0]):
if K[i] == value:
return i
return -1
def np_find(K, value):
return np.where(K == value)[0]
if __name__ == '__main__':
array = 300
H = np.random.random(array)
V = np.random.random(1)
x = np.arange(1, array + 1, dtype=np.uint16)
times = 1000
npfind = []
myfind = []
for i in range(1, array + 1):
K = H[0:i]
npfind.append(
timeit.timeit("np_find(K,V[0])", setup="from __main__ import np_find", number=times, globals=globals()))
myfind.append(
timeit.timeit("my_find(K,V[0])", setup="from __main__ import my_find", number=times, globals=globals()))
plt.plot(x, npfind, color='red')
plt.plot(x, myfind, color='blue')
plt.show()
边栏推荐
- VLOOKUP函数
- 闻泰科技与宝信软件深化5G合作, 5G制造落户中国宝武
- Codeforces Round #693 (Div. 3) C. Long Jumps 题解
- Custom class loader implementation
- 数组实现可扩展的循环队列
- MySQL 将字符串转换为数字类型并进行排序
- Assembler Instructions with C Expression Operands
- 缓存穿透、缓存击穿、缓存雪崩区别和解决方案[通俗易懂]
- C# out 关键字error CS0136 无法在此范围中声明该局部变量或参数,因为该名称在封闭局部范围中用于定义局部变量或参数
- 第二章 使用 api mgmnt 服务
猜你喜欢
随机推荐
Interview algorithm questions
C language - how to use structs and struct pointers?
FileNotFoundError: [Errno 2] No such file or directory: ‘cmake‘
ligerui 表格控件grid 根据内容更改行(单元格)颜色
Steps for installing and using redis [Linux and windows environment]
json数据的遍历、删除、判断是否为空,以及递归
Airtest踩过的坑--启动闪退
Matlab GUI编程技巧(七):matlablistbox操作-列表框(ListBox)和uilistbox常用操作
自定义view之----自定义button
我的第一篇博客
输入一个URL到这个页面呈现出来,这个过程发生了什么?
高通与苹果和解,获得至少45亿美元和解费!下一个目标:华为!
Matlab GUI programming skills (x): UI figure function to create a visual window
关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4、Unknown system variable ‘query_cache_size
EMQ映云科技荣登《中国企业家》2022年度“新锐100”榜单
Interface and abstract class
汉诺塔问题的递归实现
闻泰科技一季度营收同比猛增184.6%,净利润暴涨256.21%!
软件推荐-办公软件
Loadlibrary Failed with Error 87 | Open QTCreator Failed