2014-01-06 2 views
2

Численные массивы для числовых данных, безусловно, отлично работают, но медленнее их использовать для нечисловых данных?numpy vs list для нечисловых данных

Например, у меня есть несколько вложенных списков текстовых данных:

mammals = ['dog', 'cat', 'rat'] 
birds = ['stork', 'robin', 'penguin'] 

animals1 = [mammals, birds] 

При доступе и манипуляций этих данных в этом списке вложенных списков будет быстрее, чем Numpy эквивалент массива?

import numpy as np 
animals2 = np.array(animals1) 

Поскольку Numpy массивы реализованы в виде «strided» массив, где каждый элемент имеет фиксированную длину, а «редкий» список строк с несколькими длинными строками будет использовать непропорционально большое количество памяти, если преобразуется в NumPy массив. Но как насчет скорости?

+2

Вы всегда можете использовать пакет 'timeit' для сравнения такого рода вещей. – JoshAdel

+3

Основные преимущества numpy в производительности при численных вычислениях. Вы вряд ли увидите значительные преимущества с другими типами данных, и в некоторых случаях производительность может быть значительно хуже. – BrenBarn

ответ

3

Как отметил @JoshAdel, вы должны ознакомиться с timeit module. Я думаю, вы спрашиваете об этом сравнении:

>>> import timeit 
>>> timeit.timeit('[[x.upper() for x in y] * 10000 for y in animals1]', setup="mammals = ['dog', 'cat', 'rat']\nbirds = ['stork', 'robin', 'penguin']\nanimals1 = [mammals, birds]", number=10000) 
1.7549941045438686 
>>> timeit.timeit("numpy.char.upper(animals2)", setup="import numpy\nmammals = ['dog', 'cat', 'rat']\nbirds = ['stork', 'robin', 'penguin']\nanimals1 = [mammals, birds] * 10000\nanimals2=numpy.array(animals1)", number=10000) 
221.09816223832195 

Я обновил тест на основе вашего комментария. Вопрос хороший, но вам просто нужно попробовать другие операции с numpy.char, чтобы выяснить, как он работает. Исходный файл указывает на файл .pyd (dll-type) с функцией _vec_string.

Очевидно, что существует разница между этими двумя фрагментами трески выше, причем numpy занимает более 100 раз дольше, чтобы выполнить операцию numpy.char.upper(), чем python, для выполнения строкового метода .upper().

timeit очень прост в использовании для небольших фрагментов кода, подобных этому.

+2

И если вы используете IPython, вы можете использовать магию '% timeit' или' %% timeit', что особенно удобно. – JoshAdel

+1

Возможно, больше, чем время их создания, мне интересно, есть ли операции, которые быстрее выполняются на 'animals2', чем на' amimals1'. 'char.upper (animals2)' проще, чем '[[x.upper() для x в y] для y у животных1]', но не быстрее. Изменяется ли это, если списки/массивы намного больше? – hpaulj