# 使用 Python 數組
> 原文: [http://docs.cython.org/en/latest/src/tutorial/array.html](http://docs.cython.org/en/latest/src/tutorial/array.html)
Python 有一個內置數組模塊,支持原始類型的動態一維數組。可以從 Cython 中訪問 Python 數組的底層 C 數組。同時它們是普通的 Python 對象,當使用 [`multiprocessing`](https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing "(in Python v3.7)") 時,它們可以存儲在列表中并在進程之間進行序列化。
與使用`malloc()`和`free()`的手動方法相比,這提供了 Python 的安全和自動內存管理,并且與 Numpy 數組相比,不需要安裝依賴項,如 [`array`](https://docs.python.org/3/library/array.html#module-array "(in Python v3.7)") 模塊內置于 Python 和 Cython 中。
## 內存視圖的安全使用
```py
from cpython cimport array
import array
cdef array.array a = array.array('i', [1, 2, 3])
cdef int[:] ca = a
print(ca[0])
```
注意:導入會將常規 Python 數組對象帶入命名空間,而 cimport 會添加可從 Cython 訪問的函數。
Python 數組使用類型簽名和初始值序列構造。有關可能的類型簽名,請參閱[陣列模塊](https://docs.python.org/library/array.html)的 Python 文檔。
請注意,當將 Python 數組分配給類型為內存視圖的變量時,構造內存視圖會有輕微的開銷。但是,從那時起,變量可以無需開銷即可傳遞給其他函數,只要輸入即可:
```py
from cpython cimport array
import array
cdef array.array a = array.array('i', [1, 2, 3])
cdef int[:] ca = a
cdef int overhead(object a):
cdef int[:] ca = a
return ca[0]
cdef int no_overhead(int[:] ca):
return ca[0]
print(overhead(a)) # new memory view will be constructed, overhead
print(no_overhead(ca)) # ca is already a memory view, so no overhead
```
## 零開銷,不安全訪問原始 C 指針
為了避免任何開銷并且能夠將 C 指針傳遞給其他函數,可以將底層連續數組作為指針進行訪問。沒有類型或邊界檢查,因此請小心使用正確的類型和簽名。
```py
from cpython cimport array
import array
cdef array.array a = array.array('i', [1, 2, 3])
# access underlying pointer:
print(a.data.as_ints[0])
from libc.string cimport memset
memset(a.data.as_voidptr, 0, len(a) * sizeof(int))
```
請注意,對數組對象的任何長度更改操作都可能使指針無效。
## 克隆,擴展數組
為了避免必須使用 Python 模塊中的數組構造函數,可以創建一個與模板具有相同類型的新數組,并預分配給定數量的元素。請求時,數組初始化為零。
```py
from cpython cimport array
import array
cdef array.array int_array_template = array.array('i', [])
cdef array.array newarray
# create an array with 3 elements with same type as template
newarray = array.clone(int_array_template, 3, zero=False)
```
陣列也可以擴展和調整大小;這避免了重復的內存重新分配,如果元素將被逐個追加或刪除。
```py
from cpython cimport array
import array
cdef array.array a = array.array('i', [1, 2, 3])
cdef array.array b = array.array('i', [4, 5, 6])
# extend a with b, resize as needed
array.extend(a, b)
# resize a, leaving just original three elements
array.resize(a, len(a) - len(b))
```
## API 參考
### 數據字段
```py
data.as_voidptr
data.as_chars
data.as_schars
data.as_uchars
data.as_shorts
data.as_ushorts
data.as_ints
data.as_uints
data.as_longs
data.as_ulongs
data.as_longlongs # requires Python >=3
data.as_ulonglongs # requires Python >=3
data.as_floats
data.as_doubles
data.as_pyunicodes
```
使用給定類型直接訪問基礎連續 C 數組;例如,`myarray.data.as_ints`。
### 功能
以下函數可用于陣列模塊中的 Cython:
```py
int resize(array self, Py_ssize_t n) except -1
```
快速調整大小/重新分配。不適合重復的小增量;將基礎數組的大小調整為所請求的數量。
```py
int resize_smart(array self, Py_ssize_t n) except -1
```
高效率的小增量;使用增長模式,提供攤銷的線性時間附加。
```py
cdef inline array clone(array template, Py_ssize_t length, bint zero)
```
給定模板數組,快速創建新數組。類型與`template`相同。如果零是`True`,則新數組將用零初始化。
```py
cdef inline array copy(array self)
```
制作一個數組的副本。
```py
cdef inline int extend_buffer(array self, char* stuff, Py_ssize_t n) except -1
```
有效附加相同類型的新數據(例如相同數組類型)`n`:元素數量(不是字節數!)
```py
cdef inline int extend(array self, array other) except -1
```
使用來自另一個數組的數據擴展數組;類型必須匹配。
```py
cdef inline void zero(array self)
```
將數組的所有元素設置為零。
- Cython 3.0 中文文檔
- 入門
- Cython - 概述
- 安裝 Cython
- 構建 Cython 代碼
- 通過靜態類型更快的代碼
- Tutorials
- 基礎教程
- 調用 C 函數
- 使用 C 庫
- 擴展類型(又名.cdef 類)
- pxd 文件
- Caveats
- Profiling
- Unicode 和傳遞字符串
- 內存分配
- 純 Python 模式
- 使用 NumPy
- 使用 Python 數組
- 進一步閱讀
- 相關工作
- 附錄:在 Windows 上安裝 MinGW
- 用戶指南
- 語言基礎
- 擴展類型
- 擴展類型的特殊方法
- 在 Cython 模塊之間共享聲明
- 與外部 C 代碼連接
- 源文件和編譯
- 早期綁定速度
- 在 Cython 中使用 C ++
- 融合類型(模板)
- 將 Cython 代碼移植到 PyPy
- Limitations
- Cython 和 Pyrex 之間的區別
- 鍵入的內存視圖
- 實現緩沖協議
- 使用并行性
- 調試你的 Cython 程序
- 用于 NumPy 用戶的 Cython
- Pythran 作為 Numpy 后端