Сравнение времени @ решения Седрика Пуле (все ему благодарны, см. Его ответ) (с добавленным разбиением массива, чтобы он возвращал результат по желанию) с другим подходом numpy
, о котором я думал вначале (создать массив нулей и вставить данные на месте):
import time
import numpy as np
def time_measure(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
stop = time.time()
print(f"Elapsed time: {stop-start}")
return result
return wrapper
@time_measure
def pad_and_chunk(array, chunk_size: int):
padded_array = np.zeros(len(array) + (chunk_size - len(array) % chunk_size))
padded_array[: len(array)] = array
return np.split(padded_array, len(padded_array) / chunk_size)
@time_measure
def resize(array, chunk_size: int):
array.resize(len(array) + (chunk_size - len(array) % chunk_size), refcheck=False)
return np.split(array, len(array) / chunk_size)
@time_measure
def makechunk4(l, chunk):
l.resize((math.ceil(l.shape[0] / chunk), chunk), refcheck=False)
return l.reshape(chunk, -1)
if __name__ == "__main__":
array = np.random.rand(1_000_000)
ret = pad_and_chunk(array, 3)
ret = resize(array, 3)
ret = makechunk4(array, 3)
EDIT-EDIT
Собирая все возможные ответы, действительно, np.split
ужасно медленный по сравнению с изменением формы.
Elapsed time: 0.3276541233062744
Elapsed time: 0.3169224262237549
Elapsed time: 1.8835067749023438e-05
Способ заполнения данными не важен, это разделение, занимающее большую часть времени.