Линия
A[start:end] = B[mask]
- согласно определению языка Python - сначала вычислит правую часть, получив новый массив, содержащий выбранные строки B
и занимающий дополнительную память. Мне известно, что наиболее эффективный способ чистого Python избежать этого - использовать явный цикл:
from itertools import izip, compress
for i, b in izip(range(start, end), compress(B, mask)):
A[i] = b
Конечно, это будет намного менее затратно по времени, чем ваш оригинальный код, но он использует только O (1) дополнительной памяти. Также обратите внимание, что itertools.compress()
доступен в Python 2.7 или 3.1 или выше.