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

Python:复制一个数组。阵列`

  •  2
  • internet_user  · 技术社区  · 8 年前

    有没有办法复制 array.array (不是a list )在Python中,除了创建一个新的和复制值,或者使用 .to_something .from_something ? 我似乎在文档中找不到任何东西。如果没有,是否有类似的内置数据类型可以做到这一点?

    我正在研究一个高性能模块,所以答案越快越好。

    我当前的解决方案只是使用 .to_bytes .from_bytes ,这比我的测试快了大约1.8倍。

    3 回复  |  直到 8 年前
        1
  •  2
  •   E. Ducateme    8 年前

    不确定你的 array.array 包括但使用示例:

    >>> import array
    >>> a = array.array('i', [1, 2, 3] * 1000)
    array('i', [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1,
    2, 3, 1, 2, 3, 1, 2, 3, 1, 2, ... ])
    

    一些设置:

    >>> from copy import deepcopy
    >>> import numpy as np
    

    各种方法的计时

    (在Jupyter笔记本中使用%timeit magic):

    切片

    In [1]: %timeit cp = a[:]
    
    418 ns ± 4.89 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    深度复制

    In [2]: %timeit cp = deepcopy(a)
    
    1.83 µs ± 34 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    numpy复制。。。注意:这将生成一个numpy数组,而不是数组。大堆

    In [3]: %timeit cp = np.copy(a)
    
    1.87 µs ± 62.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    列出理解和数组。数组转换

    In [4]: %timeit cp = array.array('i', [item for item in a])
    
    147 µs ± 5.39 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    

    numpy复制和数组。数组转换

    In [5]: %timeit cp = array.array('i', np.copy(a))
    
    310 µs ± 2.25 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    

    复制到现有阵列

    In[6]: pre = array.array('i', [0, 0, 0] * 1000)
    In[7]: %timeit for i, element in enumerate(a): pre[i] = a[i]
    
    344 µs ± 7.83 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
        2
  •  0
  •   Al Sweigart mayur    4 年前

    您不需要numpy来复制 array.array 对象从那以后 大堆大堆 对象只能包含int、float或unicode字符,“浅拷贝”和“深拷贝”的概念在此不适用。

    您可以使用 [:] 复制的技巧 array.array() 对象:

    >>> import array
    >>> x = array.array('B', b'\xFF' * 10)
    >>> x
    array('B', [255, 255, 255, 255, 255, 255, 255, 255, 255, 255])
    >>> y = x[:]
    >>> y
    array('B', [255, 255, 255, 255, 255, 255, 255, 255, 255, 255])
    

    您还可以将其传递给 大堆数组() 初始化器函数。

    例如:

    >>> import array
    >>> x = array.array('B', b'\xFF' * 10)
    >>> x
    array('B', [255, 255, 255, 255, 255, 255, 255, 255, 255, 255])
    >>> y = array.array('B', x)
    >>> y
    array('B', [255, 255, 255, 255, 255, 255, 255, 255, 255, 255])
    

    确保传递相同的“类型代码”(即 'B' 在上述示例中)对于新 大堆大堆 对象

        3
  •  -1
  •   nog642    8 年前

    copy.copy(arr) 会很好的。