@@ -91,7 +91,8 @@ cdef class StridedMemoryView:
9191
9292 # Memoized properties
9393 cdef tuple _shape
94- cdef object _strides
94+ cdef tuple _strides
95+ cdef bint _strides_init # Has the strides tuple been init'ed?
9596 cdef object _dtype
9697
9798 def __init__ (self , obj = None , stream_ptr = None ):
@@ -121,20 +122,24 @@ cdef class StridedMemoryView:
121122 @property
122123 def strides(self ) -> Optional[tuple[int]]:
123124 cdef int itemsize
124- if self._strides is None and self.exporting_obj is not None:
125- if self.dl_tensor != NULL:
126- if self.dl_tensor.strides:
127- self._strides = cuda_utils.carray_int64_t_to_tuple(
128- self .dl_tensor.strides,
129- self .dl_tensor.ndim
130- )
131- else:
132- strides = self .metadata.get(" strides" )
133- if strides is not None:
134- itemsize = self .dtype.itemsize
135- self._strides = cpython.PyTuple_New(len (strides))
136- for i in range(len(strides )):
137- cpython.PyTuple_SET_ITEM(self ._strides, i, strides[i] // itemsize)
125+ if self._strides_init is False:
126+ if self.exporting_obj is not None:
127+ if self.dl_tensor != NULL:
128+ if self.dl_tensor.strides:
129+ self._strides = cuda_utils.carray_int64_t_to_tuple(
130+ self .dl_tensor.strides,
131+ self .dl_tensor.ndim
132+ )
133+ else:
134+ strides = self .metadata.get(" strides" )
135+ if strides is not None:
136+ itemsize = self .dtype.itemsize
137+ self._strides = cpython.PyTuple_New(len (strides))
138+ for i in range(len(strides )):
139+ cpython.PyTuple_SET_ITEM(
140+ self ._strides, i, strides[i] // itemsize
141+ )
142+ self ._strides_init = True
138143 return self ._strides
139144
140145 @property
0 commit comments