为什么Cython和Python版本的函数的时间相同?

为什么Cython和Python版本的函数的时间相同?,cython,Cython,我才刚开始学习Cython。我用纯Python编写了一些代码,并开始将其转换为Cython。第一个函数如下(两个版本)。我原以为Cython会更快,但速度没有差别。为什么会这样?我是做错了什么,还是应该这样做 import numpy as np cimport numpy as np import time ctypedef np.int8_t DTYPE_int cpdef np.ndarray[DTYPE_int, ndim=2] init_population(int N, int

我才刚开始学习Cython。我用纯Python编写了一些代码,并开始将其转换为Cython。第一个函数如下(两个版本)。我原以为Cython会更快,但速度没有差别。为什么会这样?我是做错了什么,还是应该这样做

import numpy as np
cimport numpy as np
import time

ctypedef np.int8_t DTYPE_int

cpdef np.ndarray[DTYPE_int, ndim=2] init_population(int N, int pop_size):
    
    cdef np.ndarray[DTYPE_int, ndim=2] p
    cdef np.ndarray[DTYPE_int, ndim=2] idx
    cdef double t1

    t1=time.time()
    p = np.full((pop_size, N), np.arange(N, dtype=np.int8))
    idx = np.random.rand(p.shape[0], p.shape[1]).argsort(axis=1).astype(np.int8)
    print("%.20f" % (time.time() - t1))
    return np.take_along_axis(p, idx, axis=1)

def py_init_population(N, pop_size):
    t1=time.time()
    p = np.full((pop_size, N), np.arange(N, dtype=np.int8))
    idx = np.random.rand(p.shape[0], p.shape[1]).argsort(axis=1).astype(np.int8)
    print("%.20f" % (time.time() - t1))
    return np.take_along_axis(p, idx, axis=1)

init_population(1000, 1000)
py_init_population(1000, 1000)
输出:
7.24499845504760742188

7.2629394531250000000

我现在找不到一个好的副本(但我肯定有一个,因为这个基本问题被问了很多次)。要点是,所有的工作都在Numpy函数内部,而不是在您的代码中,这些代码大部分都是用优化的C编写的。Cython擅长优化Numpy数组上的循环(在Python中速度很慢),但对Numpy内部操作的速度没有影响。@DavidW我也这么想过,但是我想检查一下。如果你把这个作为答案,我会接受。我现在找不到一个好的副本(但我肯定有一个,因为这个基本问题被问了很多)。要点是,所有的工作都在Numpy函数内部,而不是在您的代码中,这些代码大部分都是用优化的C编写的。Cython擅长优化Numpy数组上的循环(在Python中速度很慢),但对Numpy内部操作的速度没有影响。@DavidW我也这么想过,但是我想检查一下。如果你把这个作为回答,我会接受的。