mirror of
https://github.com/apachecn/ailearning.git
synced 2026-04-15 18:59:55 +08:00
191 lines
5.0 KiB
Markdown
191 lines
5.0 KiB
Markdown
# Cython:Typed memoryviews
|
||
|
||
## 例子
|
||
|
||
这里 `double[::1]` 是一种 `memoryview` 方法,效率跟 `Numpy` 数组差不多,可以给 `C` 数组赋值,可以给 `Numpy` 数组赋值,可以像 `Numpy` 一样切片:
|
||
|
||
In [1]:
|
||
|
||
```py
|
||
%%file cython_sum.pyx
|
||
def cython_sum(double[::1] a):
|
||
cdef double s = 0.0
|
||
cdef int i, n = a.shape[0]
|
||
for i in range(n):
|
||
s += a[i]
|
||
return s
|
||
|
||
```
|
||
|
||
```py
|
||
Writing cython_sum.pyx
|
||
|
||
```
|
||
|
||
In [2]:
|
||
|
||
```py
|
||
%%file setup.py
|
||
from distutils.core import setup
|
||
from distutils.extension import Extension
|
||
from Cython.Distutils import build_ext
|
||
|
||
ext = Extension("cython_sum", ["cython_sum.pyx"])
|
||
|
||
setup(
|
||
cmdclass = {'build_ext': build_ext},
|
||
ext_modules = [ext],
|
||
)
|
||
|
||
```
|
||
|
||
```py
|
||
Writing setup.py
|
||
|
||
```
|
||
|
||
In [3]:
|
||
|
||
```py
|
||
!python setup.py build_ext -i
|
||
|
||
```
|
||
|
||
```py
|
||
running build_ext
|
||
cythoning cython_sum.pyx to cython_sum.c
|
||
building 'cython_sum' extension
|
||
creating build
|
||
creating build\temp.win-amd64-2.7
|
||
creating build\temp.win-amd64-2.7\Release
|
||
C:\Anaconda\Scripts\gcc.bat -DMS_WIN64 -mdll -O -Wall -IC:\Anaconda\include -IC:\Anaconda\PC -c cython_sum.c -o build\temp.win-amd64-2.7\Release\cython_sum.o
|
||
writing build\temp.win-amd64-2.7\Release\cython_sum.def
|
||
C:\Anaconda\Scripts\gcc.bat -DMS_WIN64 -shared -s build\temp.win-amd64-2.7\Release\cython_sum.o build\temp.win-amd64-2.7\Release\cython_sum.def -LC:\Anaconda\libs -LC:\Anaconda\PCbuild\amd64 -lpython27 -lmsvcr90 -o "C:\Users\lijin\Documents\Git\python-tutorial\07\. interfacing with other languages\cython_sum.pyd"
|
||
|
||
```
|
||
|
||
```py
|
||
cython_sum.c: In function '__Pyx_BufFmt_ProcessTypeChunk':
|
||
cython_sum.c:13561:26: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:13561:26: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:13561:26: warning: too many arguments for format [-Wformat-extra-args]
|
||
cython_sum.c:13613:20: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:13613:20: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:13613:20: warning: too many arguments for format [-Wformat-extra-args]
|
||
cython_sum.c: In function '__pyx_buffmt_parse_array':
|
||
cython_sum.c:13675:25: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:13675:25: warning: format '%d' expects argument of type 'int', but argument 3 has type 'size_t' [-Wformat]
|
||
cython_sum.c:13675:25: warning: too many arguments for format [-Wformat-extra-args]
|
||
cython_sum.c: In function '__Pyx_GetBufferAndValidate':
|
||
cython_sum.c:13860:7: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:13860:7: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'Py_ssize_t' [-Wformat]
|
||
cython_sum.c:13860:7: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:13860:7: warning: too many arguments for format [-Wformat-extra-args]
|
||
cython_sum.c: In function '__Pyx_RaiseArgtupleInvalid':
|
||
cython_sum.c:14032:18: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:14032:18: warning: format '%s' expects argument of type 'char *', but argument 5 has type 'Py_ssize_t' [-Wformat]
|
||
cython_sum.c:14032:18: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:14032:18: warning: too many arguments for format [-Wformat-extra-args]
|
||
cython_sum.c: In function '__Pyx_RaiseTooManyValuesError':
|
||
cython_sum.c:14552:18: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:14552:18: warning: too many arguments for format [-Wformat-extra-args]
|
||
cython_sum.c: In function '__Pyx_RaiseNeedMoreValuesError':
|
||
cython_sum.c:14558:18: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:14558:18: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'Py_ssize_t' [-Wformat]
|
||
cython_sum.c:14558:18: warning: too many arguments for format [-Wformat-extra-args]
|
||
cython_sum.c: In function '__Pyx_ValidateAndInit_memviewslice':
|
||
cython_sum.c:15253:22: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:15253:22: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'Py_ssize_t' [-Wformat]
|
||
cython_sum.c:15253:22: warning: unknown conversion type character 'z' in format [-Wformat]
|
||
cython_sum.c:15253:22: warning: too many arguments for format [-Wformat-extra-args]
|
||
|
||
```
|
||
|
||
In [4]:
|
||
|
||
```py
|
||
from cython_sum import cython_sum
|
||
from numpy import *
|
||
|
||
```
|
||
|
||
In [5]:
|
||
|
||
```py
|
||
a = arange(1e6)
|
||
|
||
```
|
||
|
||
检查正确性:
|
||
|
||
In [6]:
|
||
|
||
```py
|
||
cython_sum(a)
|
||
|
||
```
|
||
|
||
Out[6]:
|
||
|
||
```py
|
||
499999500000.0
|
||
```
|
||
|
||
In [7]:
|
||
|
||
```py
|
||
a.sum()
|
||
|
||
```
|
||
|
||
Out[7]:
|
||
|
||
```py
|
||
499999500000.0
|
||
```
|
||
|
||
效率:
|
||
|
||
In [8]:
|
||
|
||
```py
|
||
%timeit cython_sum(a)
|
||
|
||
```
|
||
|
||
```py
|
||
100 loops, best of 3: 2.14 ms per loop
|
||
|
||
```
|
||
|
||
In [9]:
|
||
|
||
```py
|
||
%timeit a.sum()
|
||
|
||
```
|
||
|
||
```py
|
||
100 loops, best of 3: 2.38 ms per loop
|
||
|
||
```
|
||
|
||
In [10]:
|
||
|
||
```py
|
||
import zipfile
|
||
|
||
f = zipfile.ZipFile('07-06-cython-sum.zip','w',zipfile.ZIP_DEFLATED)
|
||
|
||
names = ['cython_sum.pyx',
|
||
'setup.py']
|
||
for name in names:
|
||
f.write(name)
|
||
|
||
f.close()
|
||
|
||
!rm -f setup*.*
|
||
!rm -f cython_sum*.*
|
||
!rm -rf build
|
||
|
||
``` |