【发布时间】:2019-03-01 14:30:12
【问题描述】:
我有一个大量使用 numpy 的模块:
from numpy import array, median, nan, percentile, roll, sqrt, sum, transpose, unique, where
使用来保持命名空间干净是不是更好的做法
import numpy as np
然后当我需要使用array 时,只需使用np.array,例如?
这个模块也会被重复调用,比如几百万次,保持命名空间干净似乎会增加一些开销?
setup = '''import numpy as np'''
function = 'x = np.sum(np.array([1,2,3,4,5,6,7,8,9,10]))'
print(min(timeit.Timer(function, setup=setup).repeat(10, 300000)))
1.66832
setup = '''from numpy import arange, array, sum'''
function = 'x = sum(array([1,2,3,4,5,6,7,8,9,10]))'
print(min(timeit.Timer(function, setup=setup).repeat(10, 300000)))
1.65137
为什么在使用 np.sum 和 sum 时这会增加更多时间?
【问题讨论】:
-
您可能使用默认的
sum而不是np.sum -
@ycx 如果 OP 使用了
from numpy import sum,它会隐藏默认的sum。 -
我认为差异很小,无法产生显着差异。我认为如果你在同一条线上运行几次,你会得到不同的结果,但无论如何都会在相同的范围内。此外,AFAIK CPU 内核会进行一些缓存,因此如果它认为它两次执行相同的计算,它将使用它的缓存,我了解到这一点,因为这是之前较大的 CPU 漏洞利用之一(例如崩溃)的基础。尝试颠倒测试的顺序,看看第二种方法是否始终较低。
-
我可以确认 a) 订单没有影响 b) 存在显着的性能差异。我绘制了两个实验结果的直方图(比较最小值不是很好)。结果:“import numpy”方法速度较慢,并且差异也更大。我的假设是,每次它询问“嘿,numpy,请给我你的求和函数”,而“导入函数”方法直接在命名空间中注册求和函数。但是我对实际的实现没有深入的了解,所以只是一个疯狂的猜测。
-
“显着的性能差异”并不是说“你永远不应该导入模块”(我总是使用
import numpy as np),我只是说“性能不一样”。