2015-02-16 2 views
0

Я работаю над файлами, которые потребуют от меня загрузки целых чисел в массив длиной ~ 18 миллионов.Сколько памяти и обработки требуется для преобразования в массив numpy

Сколько памяти и времени обработки это займет, чтобы сделать что-то вроде

my_list = [123,231,90,20,...,92] #length is 18 million 
new_list = np.array(my_list, type='int') 

Будет ли это компьютер просто создать второй массив, который имеет 18 миллионов в длину и тиражирование или делает NumPy сделать что-то более сложное.

ответ

2

В этом случае «время обработки» не во многом связано с тем, что это в основном вопрос поиска указателей. Поскольку вы отметили сообщение big-O, это будет O(n). При преобразовании Python list в массив Numpy он зарезервирует память для хранения целых чисел len(my_list) в массиве - вы можете точно узнать, сколько памяти это, увидев, что тип int по умолчанию на вашем Numpy, и используя атрибут .itemsizedtype объекта:

>>> np.dtype('int') 
dtype('int64') 
>>> np.dtype('int').itemsize 
8 

Так этот массив потребуется 8 * len(my_list) байт для хранения в верхней части памяти уже используемой исходной my_list.

Это нужно будет перебрать каждый элемент в списке, посмотреть, какой тип Python объекта он (помните, Python list s может быть неоднородным - нет никакого способа узнать, априори, что каждый элемент в список будет преобразован в целое число). Затем Numpy сделает все возможное, чтобы преобразовать этот объект Python в целое число и сохранить его в списке.

В зависимости от того, где эти 18 миллионов целых чисел поступают из него, может быть желательно не хранить их в Python list в первую очередь, если это вообще возможно. Но говорить что-нибудь еще об этом потребует более подробных вопросов.

+0

Ярмарка достаточно. Похоже, я должен просто начать все в мирном мире. Много раз я вижу вещи, которые говорят «о, это технически лучше, но конечный результат не имеет значения», но я думаю, что мои наборы данных могут быть достаточно большими, чтобы его стоило переписать код. Спасибо за информацию. – Howard

+0

Ну, конечно, это полностью зависит. И, как и большинство вещей, все зависит от того, как вы его используете. Но это хорошая ставка. Если у вас есть более конкретные вопросы о вашем коде, тогда можно сказать больше. – Iguananaut