Я использую модули массивов для хранения значительных чисел (много гигабайт) беззнаковых 32-битных ints. Вместо того, чтобы использовать 4 байта для каждого элемента, python использует 8 байтов, как указано array.itemsize, и проверяется pympler.Могу ли я заставить элементы массива python иметь определенный размер?
например:
>>> array("L", range(10)).itemsize
8
У меня есть большое количество элементов, поэтому я хотел бы извлечь выгоду из их хранения в течение 4-х байтов.
Numpy позволит мне хранить значения как беззнаковое 32 битных целых чисел:
>>> np.array(range(10), dtype = np.uint32).itemsize
4
Но проблема заключается в том, что любая операция с использованием оператора индекса Numpy составляет примерно в два раза медленнее, поэтому операции, которые не являются векторные операции поддерживаются by numpy медленны. например:
python3 -m timeit -s "from array import array; a = array('L', range(1000))" "for i in range(len(a)): a[i]"
10000 loops, best of 3: 51.4 usec per loop
против
python3 -m timeit -s "import numpy as np; a = np.array(range(1000), dtype = np.uint32)" "for i in range(len(a)): a[i]"
10000 loops, best of 3: 90.4 usec per loop
Поэтому я вынужден либо использовать в два раза больше памяти, как хотелось бы, или программа будет работать в два раза медленнее, как хотелось бы. Есть ли способ обойти это? Могу ли я заставить массивы python использовать указанные элементы?
https://bugs.python.org/issue26821 –
Это ложная дихотомия: ваша программа может использовать меньше памяти и быть быстрее. Хотя это не связано с вопросом, можете ли вы использовать элементы массива фиксированного размера на разных платформах ('array', вероятно, использует типы C типа, родные для платформы). Это отдельный вопрос: как сделать конкретные вычисления на основе numpy быстрее. – jfs