首页 文章

NumPy优于常规Python列表有什么优势?

提问于
浏览
386

NumPy优于常规Python列表有什么优势?

我有大约100个金融市场系列,我将创建一个100x100x100 = 100万个单元的立方体阵列 . 我将使用每个y和z对每个x进行回归(3变量),以用标准错误填充数组 .

我听说过“大型矩阵”我应该使用NumPy而不是Python列表,这是出于性能和可扩展性的原因 . 事实是,我知道Python列表,它们似乎对我有用 .

如果我搬到NumPy,会有什么好处?

如果我有1000个系列(即立方体中有10亿个浮点单元)怎么办?

5 回答

  • 209

    另请注意,在时间序列scikits中支持基于NumPy的时间序列:

    http://pytseries.sourceforge.net

    对于回归,我很确定即使对于100 ^ 3问题,NumPy也会比列表更快,更方便 .

  • 100

    以下是scipy.org website常见问题解答中的一个很好的答案:

    What advantages do NumPy arrays offer over (nested) Python lists?

    Python的列表是高效的通用容器 . 它们支持(相当)有效的插入,删除,追加和连接,Python的列表推导使它们易于构造和操作 . 但是,它们有一些限制:它们不支持元素化加法和乘法等“向量化”操作,并且它们可以包含不同类型的对象,这意味着Python必须存储每个元素的类型信息,并且必须执行类型调度代码在对每个元素进行操作时这也意味着可以通过有效的C循环执行很少的列表操作 - 每次迭代都需要类型检查和其他Python API簿记 .

  • 627

    亚历克斯提到了记忆效率,罗伯托提到了方便,这些都是好点 . 还有一些想法,我会提到 speedfunctionality .

    功能:你可以使用NumPy,FFT,卷积,快速搜索,基本统计,线性代数,直方图等内置很多内容 . 真的,谁能在没有FFT的情况下生存?

    速度:这是对列表和NumPy数组进行求和的测试,显示NumPy数组上的总和快10倍(在此测试中 - 里程可能会有所不同) .

    from numpy import arange
    from timeit import Timer
    
    Nelements = 10000
    Ntimeits = 10000
    
    x = arange(Nelements)
    y = range(Nelements)
    
    t_numpy = Timer("x.sum()", "from __main__ import x")
    t_list = Timer("sum(y)", "from __main__ import y")
    print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
    print("list:  %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))
    

    在我的系统上(当我运行备份时)给出:

    numpy: 3.004e-05
    list:  5.363e-04
    
  • 15

    NumPy不仅效率更高;它也更方便 . 你可以免费获得大量的向量和矩阵运算,这有时可以避免不必要的工作 . 它们也得到有效实施 .

    例如,您可以直接从文件中将多维数据集读取到数组中:

    x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))
    

    沿第二个维度求和:

    s = x.sum(axis=1)
    

    找出哪些单元格高于阈值:

    (x > 0.5).nonzero()
    

    沿第三维删除每个偶数索引切片:

    x[:, :, ::2]
    

    此外,许多有用的库与NumPy数组一起使用 . 例如,统计分析和可视化库 .

    即使您没有性能问题,学习NumPy也是值得的 .

  • 36

    NumPy的数组比Python列表更紧凑 - 如你所描述的,在Python中,列表列表至少需要20 MB左右,而单元格中具有单精度浮点数的NumPy 3D数组将适合4 MB . 使用NumPy时,读取和写入项目的访问速度也更快 .

    也许你对这一百万个单元并不那么关心,但你绝对会选择十亿个单元 - 这两种方法都不适合32位架构,但是对于64位构建,NumPy会以4 GB左右的速度逃脱,Python本身至少需要大约12 GB(许多指针,其大小加倍) - 一个更昂贵的硬件!

    差异主要是由于“间接性” - Python列表是指向Python对象的指针数组,每个指针至少4个字节加上16个字节,即使是最小的Python对象(4个用于类型指针,4个用于引用计数,4个) for value - 内存分配器最多可达16个 . NumPy数组是一个统一值的数组 - 单精度数字每个需要4个字节,双精度数字,8个字节 . 灵活性较差,但您为标准Python列表的灵活性付出了大量代价!

相关问题