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 到 运行。这似乎与数组形状和大小无关,表明没有实际数据被复制。
假设我有以下 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 到 运行。这似乎与数组形状和大小无关,表明没有实际数据被复制。