Python numpy,多个操作是否会导致创建中间数组?
我想知道这两者是否相等:Python numpy,多个操作是否会导致创建中间数组?,python,performance,numpy,Python,Performance,Numpy,我想知道这两者是否相等: 将numpy导入为np a=np.arange(100000)+1 # 1 b=10*np.log10(a) # 2 c=np.空的(a) c=np.multiply(10,np.log10(a,out=c,out=c) 更准确地说,我想知道numpy是否找到了某种方法来创建数组b,而不需要为日志操作的结果分配和丢弃中间数组。当然,这只适用于非常大的阵列。就计算时间而言,它们似乎大致相似,尽管第一个版本稍好一些: [1]中的:将numpy作为np导入 在[2]中:a=
将numpy导入为np
a=np.arange(100000)+1
# 1
b=10*np.log10(a)
# 2
c=np.空的(a)
c=np.multiply(10,np.log10(a,out=c,out=c)
更准确地说,我想知道numpy是否找到了某种方法来创建数组
b
,而不需要为日志操作的结果分配和丢弃中间数组。当然,这只适用于非常大的阵列。就计算时间而言,它们似乎大致相似,尽管第一个版本稍好一些:
[1]中的:将numpy作为np导入
在[2]中:a=np.arange(100_000,dtype=float)+1
在[3]中:定义f(a):
…:b=10*np.log10(a)
...:
在[4]中:定义g(a):
…:c=np.空的像(a)
…c=np.multiply(10,np.log10(a,out=c,out=c)
...:
在[5]:%timeit f(a)
每个回路759µs±52.2µs(7次运行的平均值±标准偏差,每个1000个回路)
在[6]:%timeit g(a)
每个回路877µs±39.8µs(7次运行的平均值±标准偏差,每个1000个回路)
是的,是的。如果你正在寻找一种在内存限制下工作的替代方案,考虑使用避免中间数组来澄清:“是的,他们这样做”,你的意思是他们在中间1的情况下创建中间数组,对吗?在第二种情况下不是,但我想它有点难看。在第一种情况下是,在第二种情况下不是。注意np.log10(a,out=c);np.multiply(10,c,out=c)
会更干净、更容易混淆。有趣的结果。理解为什么第一个表现更好是值得的。不过我不知道。老实说,%timeit
的结果在不同的运行中确实有所不同,有时g
比f
做得更好。我想说,一般来说,它们是一样的。