2011-12-02 6 views
5

У меня возникли вопросы, подобные этому, но никто не обратился напрямую к проблеме. Я приурочил следующие два способа заполнения массива и половину времени, используя np.zeros() быстрее, а половина времени делает это напрямую быстрее. Есть ли предпочтительный способ? Я совершенно новичок в использовании массивов numpy и участвовал в ускорении моего кода, не слишком много думая о удобочитаемости.Самый быстрый способ заполнить массив 1D numpy

import numpy as np 
import time 

lis = range(100000) 

timer = time.time() 
list1 = np.array(lis) 
print 'normal array creation', time.time() - timer, 'seconds' 

timer = time.time() 
list2 = np.zeros(len(lis)) 
list2.fill(lis) 
print 'zero, fill - array creation', time.time() - timer, 'seconds' 

Спасибо

+0

вещий способ эталонной скорости выполнения использует [ 'timeit'] (http://docs.python.org /library/timeit.html). – mac

+0

@mac ok Я буду использовать это с этого момента. Это в значительной степени первый раз/профиль (cProfiler), который мне нужен для выполнения моих функций. – Anake

ответ

5

Если у вас есть список перемещаемых a=[x/10. for x in range(100000)], то вы можете создать массив с:

np.array(a) # 9.92ms 
np.fromiter(a, dtype=np.float) # 5.19ms 

Ваш подход

list2 = np.zeros(len(lis)) 
list2.fill(lis) 

не будет работать как и ожидалось. .fill заполняет весь массив одним значением.

+0

Извините, должно быть, было более явным, этот код предназначен только для проверки скорости, он будет заполнен реальными данными, когда я его буду использовать , (точки данных будут плавать) – Anake

+1

Для 'np.array' и' np.fromiter' я удивлен, что второе быстрее. Если это итератор numpy не будет знать, сколько памяти выделяется вначале. (Он должен проверять, может ли он получить длину.) Лучшая производительность - это то, что вы указываете numpy на явный тип. Если вы передали dtype в 'np.array', это будет быстрее. – AFoglia

1

Ваш пример list2 просто не работает - если вы проверите list2, вы обнаружите, что он все еще содержит все нули. Я считаю, что достижение читаемости - это не просто хорошая цель сама по себе. Это также приводит к увеличению вероятности правильного кода.

+3

Должно быть, комментарий ... :) – mac

+0

Упс, на самом деле не проверил, что он работает. Спасибо за это – Anake

1

Первый список может быть создан быстрее с помощью функции arange Numpy:

list3 = np.arange(100000)

Вы также можете найти полезную функцию linspace.

2

np.fromiter будет предварительно выделить выходной массив, если с учетом количества элементов:

a = [x/10. for x in range(100000)] # 10.3ms 
np.fromiter(a, dtype=np.float) # 3.33ms 
np.fromiter(a, dtype=np.float, count=100000) # 3.03ms 
Смежные вопросы