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

numpy数组与python数组

  •  3
  • norok2  · 技术社区  · 6 年前

    我注意到 事实上 python中数组操作的标准是 numpy 图书馆。但是,我知道python标准库有一个 array 模块,在我看来它有一个类似于numpy的用例。

    有没有真实的例子 阵列 是可取的 纽比 或者只是普通的 list 是吗?

    从我天真的解释来看, 阵列 只是用于同构数据的内存高效容器,但无法提高计算效率。


    编辑

    出于好奇,我在github中搜索 import array 对于python点击186'721计数,而 import numpy 击中8062678次。

    但是,使用 阵列 是的。

    3 回复  |  直到 6 年前
        1
  •  6
  •   norok2    6 年前

    了解 numpy array ,我又做了一些定量测试。

    我发现,对于我的系统(ubuntu 18.04,python3), 阵列 range 发电机与 纽比 (尽管 纽比 np.arange() 看起来要快得多——实际上太快了,也许它在测试期间缓存了一些东西),但是比使用 list 是的。

    然而, 出人意料 , 阵列 物体似乎比 纽比 相对应的人。 取而代之的是 列表 物体大约比 阵列 对象(显然,这将随单个项的大小而变化)。 与 列表 我是说, 阵列 提供了一种控制数字对象大小的方法。

    所以,也许,对于 阵列 实际上是当 纽比 不可用。

    为了完整起见,下面是我用于测试的代码:

    import numpy as np
    import array
    import sys
    
    num = int(1e6)
    num_i = 100
    x = np.logspace(1, int(np.log10(num)), num_i).astype(int)
    
    %timeit list(range(num))
    # 10 loops, best of 3: 32.8 ms per loop
    
    %timeit array.array('l', range(num))
    # 10 loops, best of 3: 86.3 ms per loop
    
    %timeit np.array(range(num), dtype=np.int64)
    # 10 loops, best of 3: 180 ms per loop
    
    %timeit np.arange(num, dtype=np.int64)
    # 1000 loops, best of 3: 809 µs per loop
    
    
    y_list = np.array([sys.getsizeof(list(range(x_i))) for x_i in x])
    y_array = np.array([sys.getsizeof(array.array('l', range(x_i))) for x_i in x])
    y_np = np.array([sys.getsizeof(np.array(range(x_i), dtype=np.int64)) for x_i in x])
    
    import matplotlib.pyplot as plt
    
    plt.figure(figsize=(12, 6))
    plt.plot(x, y_list, label='list')
    plt.plot(x, y_array, label='array')
    plt.plot(x, y_np, label='numpy')
    plt.legend()
    plt.show()
    

    Plot of Object Sizes

        2
  •  2
  •   minmax    6 年前

    是的,如果您不希望代码中有其他依赖项。

        3
  •  1
  •   Jeff Ellen    6 年前

    你指的是2018年还是2002年的真实世界?numpy最初是作为python的扩展,而不是作为核心库的一部分。所以这就是为什么它是这样的,而不是因为任何性能权衡。

    https://scipy.github.io/old-wiki/pages/History_of_SciPy.html

    你好像在问一个更一般的问题的具体版本。也许如果你想得更笼统些,你会发现你的问题可能不是很有用。存在特定模块以提供核心语言中不可用的特征。如果它们更加优化,拥有更多的功能,或者即使它们被更多地使用,也不奇怪。

    这并不意味着你必须使用它们,也不意味着把它们留在里面是一个问题。

    我想我不明白 为什么 你在问这个问题,它会帮助我们试着给你一个更好的答案。