class TimeSlice: def setup(self): self.s1 = Slice(0, 30) self.s2 = Slice(0, 1, 10) def time_constructor_slice(self): Slice(slice(0, 30)) def time_constructor_ints(self): Slice(0, 1, 10) def time_constructor_invalid(self): try: Slice(0.5) except TypeError: pass def time_reduce(self): self.s1.reduce() self.s2.reduce() def time_reduce_shape(self): self.s1.reduce(10) self.s2.reduce(10) def time_newshape(self): self.s1.newshape((10, 5)) self.s2.newshape((10, 5)) def time_isempty(self): self.s1.isempty() def time_isempty_shape(self): self.s1.isempty((10, 5))
def __setitem__(self, key, value): if isinstance(key, np.ndarray): key = key.tobytes() if not isinstance(key, bytes): raise TypeError(f"key must be bytes, got {type(key)}") if len(key) != self.hash_size: raise ValueError("key must be %d bytes" % self.hash_size) if isinstance(value, Tuple): if len(value.args) > 1: raise NotImplementedError( "Chunking in more other than the first dimension") value = value.args[0] if not isinstance(value, (slice, Slice)): raise TypeError("value must be a slice object") value = Slice(value) if value.isempty(): return if value.step not in [1, None]: raise ValueError("only step-1 slices are supported") kv = (list(key), (value.start, value.stop)) if key in self._indices: if bytes(self.hash_table[self._indices[key]])[0] != key: raise ValueError( "The key %s is already in the hashtable under another index." ) self.hash_table[self._indices[key]] = kv else: if self.largest_index >= self.hash_table.shape[0]: newshape = (self.hash_table.shape[0] + self.chunk_size, ) new_hash_table = np.zeros(newshape, dtype=self.hash_table.dtype) new_hash_table[:self.hash_table.shape[0]] = self.hash_table self.hash_table = new_hash_table self.hash_table[self.largest_index] = kv self._indices[key] = self.largest_index self.largest_index += 1