Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy,多个操作是否会导致创建中间数组?_Python_Performance_Numpy - Fatal编程技术网

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
做得更好。我想说,一般来说,它们是一样的。