numpy.asarray() 在类型化 MemoryView 对象上的性能有多好?

How good is the performance of numpy.asarray() on typed MemoryView objects?

假设我有以下 Cython 代码:

cimport cython
cimport numpy as np
import numpy as np

cdef np.int64_t[:] view = np.zeros(1000, dtype=np.int64)
array = np.asarray(view)

np.asarray() 是做什么的,速度有多快?此操作的速度是否取决于数组的大小?通过从一开始就保留原始 ndarray 对象来避免这种情况通常是个好主意吗?

我现在对 asarray() 进行了基准测试:

asarray_benchmark.pyx:

cimport cython
cimport numpy as np

import numpy as np


ctypedef np.int32_t int32


def no_op(int32[:] a):
    pass

def as_array(int32[:] a):
    np.asarray(a)

main.py:

from asarray_benchmark import no_op, as_array

import time
N = 1_000_000
now = time.time_ns()
array = np.zeros(100_000_000, dtype=np.int32)
for _ in range(N):
    no_op(array)
print(f"noop:    {(time.time_ns() - now) / N :>12.3f} ns")
for _ in range(N):
    as_array(array)
print(f"asarray: {(time.time_ns() - now) / N :>12.3f} ns")

结果:

noop:         317.934 ns
asarray:     1498.773 ns

在我的笔记本上 np.asarray() 似乎需要 ~1 μs 到 运行。这似乎与数组形状和大小无关,表明没有实际数据被复制。