gpt4 book ai didi

python - Cython优化

转载 作者:太空狗 更新时间:2023-10-30 02:17:58 26 4
gpt4 key购买 nike

我正在用 Python 编写一个相当大的模拟,并希望从 Cython 获得一些额外的性能。然而,对于下面的代码,我似乎并没有得到那么多,即使它包含一个相当大的循环。大约 10 万次迭代。

我是不是让一些初学者犯了错误,或者这个循环大小只是为了小而产生大效果? (在我的测试中,Cython 代码只快了大约 2 倍)。

import numpy as np;
cimport numpy as np;
import math

ctypedef np.complex64_t cpl_t
cpl = np.complex64

def example(double a, np.ndarray[cpl_t,ndim=2] A):

cdef int N = 100

cdef np.ndarray[cpl_t,ndim=3] B = np.zeros((3,N,N),dtype = cpl)

cdef Py_ssize_t n, m;
for n in range(N):
for m in range(N):

if np.sqrt(A[0,n]) > 1:
B[0,n,m] = A[0,n] + 1j * A[0,m]

return B;

最佳答案

您应该使用编译器指令。我用 Python 写了你的函数

import numpy as np

def example_python(a, A):
N = 100
B = np.zeros((3,N,N),dtype = np.complex)
aux = np.sqrt(A[0])
for n in range(N):
if aux[n] > 1:
for m in range(N):
B[0,n,m] = A[0,n] + 1j * A[0,m]
return B

在 Cython 中(您可以了解编译器指令 here)

import cython
import numpy as np
cimport numpy as np

ctypedef np.complex64_t cpl_t
cpl = np.complex64

@cython.boundscheck(False) # compiler directive
@cython.wraparound(False) # compiler directive
def example_cython(double a, np.ndarray[cpl_t,ndim=2] A):

cdef int N = 100
cdef np.ndarray[cpl_t,ndim=3] B = np.zeros((3,N,N),dtype = cpl)
cdef np.ndarray[float, ndim=1] aux
cdef Py_ssize_t n, m
aux = np.sqrt(A[0,:]).real
for n in range(N):
if aux[n] > 1.:
for m in range(N):
B[0,n,m] = A[0,n] + 1j * A[0,m]
return B

比较两者的功能

c = np.array(np.random.rand(100,100)+1.5+1j*np.random.rand(100,100), dtype=np.complex64)

%timeit example_python(100, c)
10 loops, best of 3: 61.8 ms per loop

%timeit example_cython(100, c)
10000 loops, best of 3: 134 µs per loop

在这种情况下,Cython 比 Python 快约 450 倍。

关于python - Cython优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38129097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com