赛顿优化

2024-06-16 19:17:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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;

Tags: 代码inimportnumpyforasnprange
1条回答
网友
1楼 · 发布于 2024-06-16 19:17:03

您应该使用编译器指令。我用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

^{pr2}$

我比较了这两种功能

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倍左右。在

相关问题 更多 >