代码之家  ›  专栏  ›  技术社区  ›  unfolx

numpy数组不等式的执行时间

  •  0
  • unfolx  · 技术社区  · 4 月前

    在下面得到两个截然不同的执行时间

    import numpy as np
    import time
    
    array = np.arange(0, 750000)
    param = 20000
    
    t1 = time.time()
    for _ in range(param):
      array <= 120
    print(round(time.time() - t1), _)
    # 9 19999
    
    t2 = time.time()
    for _ in range(param):
      array - 120 <= 0
    print(round(time.time() - t2), _)
    # 19 19999
    

    期望这两种方法的执行时间相似。

    这种差异背后的基本原理是什么?在第二种方法中,numpy是否将120内部转换为数组?

    代码优化还需要注意哪些类似的瓶颈?很高兴阅读相关文档。谢谢!

    1 回复  |  直到 4 月前
        1
  •  2
  •   user2357112    4 月前

    NumPy无法执行 array - 120 <= 0 作为单个融合操作,或将表达式重写为 array <= 120 它需要按照所写的两个步骤执行操作:

    array - 120
    

    result <= 0
    

    并且这些操作中的每一个都构建了一个新的750000个元素数组。一个750000个元素的减法结果数组和一个7500000个元素的比较结果数组。

    这比将每个元素与120进行比较并直接构建比较结果数组要慢得多,因为 数组<=120 做。