【问题标题】:import numpy as np versus from numpy import将 numpy 导入为 np 与从 numpy 导入
【发布时间】: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.sumsum 时这会增加更多时间?

【问题讨论】:

  • 您可能使用默认的sum 而不是np.sum
  • @ycx 如果 OP 使用了from numpy import sum,它会隐藏默认的sum
  • 我认为差异很小,无法产生显着差异。我认为如果你在同一条线上运行几次,你会得到不同的结果,但无论如何都会在相同的范围内。此外,AFAIK CPU 内核会进行一些缓存,因此如果它认为它两次执行相同的计算,它将使用它的缓存,我了解到这一点,因为这是之前较大的 CPU 漏洞利用之一(例如崩溃)的基础。尝试颠倒测试的顺序,看看第二种方法是否始终较低。
  • 我可以确认 a) 订单没有影响 b) 存在显着的性能差异。我绘制了两个实验结果的直方图(比较最小值不是很好)。结果:“import numpy”方法速度较慢,并且差异也更大。我的假设是,每次它询问“嘿,numpy,请给我你的求和函数”,而“导入函数”方法直接在命名空间中注册求和函数。但是我对实际的实现没有深入的了解,所以只是一个疯狂的猜测。
  • “显着的性能差异”并不是说“你永远不应该导入模块”(我总是使用import numpy as np),我只是说“性能不一样”。

标签: python numpy import


【解决方案1】:

你是对的,最好保持命名空间干净。所以我会使用

import numpy as np

它使您的代码更具可读性,当您看到像 np.sum(array) 这样的调用时,会提醒您应该使用 numpy 数组。第二个原因是许多 numpy 函数与其他模块(如 scipy)中的函数具有相同的名称...如果您同时使用两者,则始终清楚您使用的是哪一个。

正如您在所做的测试中看到的那样,性能差异是存在的,如果您真的需要性能,您可以采用其他方式。

性能上的差异在于,在特定函数导入的情况下,您在脚本开头引用了 numpy 模块中的函数。 在一般模块导入的情况下,您只导入对模块的引用,python 需要在每次调用时解析/查找您在该模块中使用的函数。

【讨论】:

    【解决方案2】:

    如果您可以定义自己的别名(当然要遵守您的团队​​约定),您可以两全其美(更快的名称解析和无阴影):

    import numpy as np
    (np_sum, np_min, np_arange) = (np.sum, np.min, np.arange)
    
    x = np_arange(24)
    print (np_sum(x))
    

    定义别名的替代语法:

    from numpy import \
        arange as np_arange, \
        sum as np_sum, \
        min as np_min
    

    【讨论】:

    • 很好,我能问一下:为什么list 超过tuple?这有什么原因吗?
    • @ycx:元组也可以,而且可能更传统。也许,我应该编辑:-)
    猜你喜欢
    • 2019-09-13
    • 2018-12-03
    • 2017-07-18
    • 2012-08-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    相关资源
    最近更新 更多