繁体   English   中英

Python:复制`array.array`

[英]Python: Copy an `array.array`

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

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

我目前的解决方案只是使用.to_bytes.from_bytes ,这比我的测试快了大约 1.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 Notebook 中使用 %timeit 魔法):

切片

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 copy ... 注意:这会产生一个 numpy 数组,而不是一个 array.array

In [3]: %timeit cp = np.copy(a)

1.87 µs ± 62.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

列表理解和 array.array 转换

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 复制和 array.array 转换

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)

您不需要 numpy 来复制array.array对象。 由于array.array对象只能包含整数、浮点数或 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])

您还可以将其传递给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 = array.array('B', x)
>>> y
array('B', [255, 255, 255, 255, 255, 255, 255, 255, 255, 255])

确保为新的array.array对象传递相同的“类型代码”(上例中的'B' )。

copy.copy(arr)可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM