代码之家  ›  专栏  ›  技术社区  ›  Kota Mori

速度比较。numpy与python标准

  •  12
  • Kota Mori  · 技术社区  · 7 年前

    random math 图书馆比图书馆快 numpy

    努比 对于大规模(矢量)操作来说要快得多。我猜是这样的 努比

    努比 对于小型(通常是标量)操作?

    import math
    import random
    import numpy as np
    

    %timeit math.log(10)
    # 158 ns ± 6.16 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
    
    %timeit np.log(10)
    # 1.64 µs ± 93.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    
    %timeit math.exp(3)
    # 146 ns ± 8.57 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
    
    %timeit np.exp(3)
    # 1.72 µs ± 78.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    生成正态分布

    %timeit random.gauss(0, 1)
    # 809 ns ± 12.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    
    %timeit np.random.normal()
    # 2.57 µs ± 14.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    

    %timeit random.choices([1,2,3], k=1)
    # 1.56 µs ± 55.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    
    %timeit np.random.choice([1,2,3], size=1)
    # 23.1 µs ± 1.04 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    

    与numpy数组相同

    arr = np.array([1,2,3])
    
    %timeit random.choices(arr, k=1)
    # 1.72 µs ± 33.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    
    %timeit np.random.choice(arr, size=1)
    # 18.4 µs ± 502 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    

    arr = np.arange(10000)
    
    %timeit random.choices(arr, k=1000)
    # 401 µs ± 6.16 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    %timeit np.random.choice(arr, size=1000)
    # 41.7 µs ± 1.39 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    
    2 回复  |  直到 7 年前
        1
  •  13
  •   Daniel F    7 年前

    numpy 只是对大数据块的性能改进。在注入内存之前确保内存块正确排列的开销 ndarray 编译成c语言 努比 问题基本上是“如何处理这个循环代码并使之快速”,以及为什么在这个标签中它被认为是一个有效的问题,而几乎任何其他标签都会将您抛向它 Code review

    . 努比 没有矢量化的代码总是比裸代码慢 python 可以说,这和用手提钻敲碎一个核桃一样“错误”。要么找到合适的工具,要么多拿些螺母。

        2
  •  5
  •   jpp    7 年前

    NumPy主要用于 . 这依赖于连续内存块的使用和更有效的低级迭代。对标量应用NumPy数学函数或计算随机数都不是可向量化的操作。这就解释了你所看到的行为。

    另请参见 What are the advantages of NumPy over regular Python lists?

    小的(通常是标量的)操作比NumPy好吗?

    很少有程序的瓶颈是由对标量的操作造成的。在实践中,这些差异可以忽略不计。所以不管哪种方式都可以。如果您已经在使用NumPy,那么继续在标量上使用NumPy操作是没有坏处的。

    random vs NumPy可能不一样:

    assert random.gauss(0, 1) == np.random.normal()  # AssertionError
    assert random.choices(arr, k=1)[0] == np.random.choice(arr, size=1)[0]  # AssertionError
    

    在NumPy中有额外的功能使随机数“可预测”。例如,反复运行以下脚本只会生成相同的结果:

    np.random.seed(0)
    np.random.normal()
    

    这同样适用于 np.random.choice . 所以在这方面有区别