假设我有以下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对象来避免这种情况通常是个好主意吗?
发布于 2021-07-01 11:02:23
我现在给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μ。这似乎与数组的形状和大小无关,表明没有复制实际的数据。
https://stackoverflow.com/questions/66285789
复制相似问题