2014-12-21 2 views
2

Кажется, что много вещей, которые я делаю в Пандах, имеют выпуклые вычислительные затраты времени в количестве данных, которые у меня есть (например, 1 строка занимает 1 секунду, 2 строки занимают 2,2 секунды, 4 строки занимают 6 секунд и т. Д.).Когда вычислительная стоимость применения функции выпукла?

Почему вычислительные затраты не линейно увеличивают объем данных, которые у меня есть? Например, эту функцию я написал:

def fractrips1brand(trip): 
    # Get number of transaction rows for THIS sepcific consumer 
    art = trip[trip.Item_Id.isin(insidegood)].Item_Id.nunique() 
    output = pd.Series({'numinsidegoods': art }) 
    return output 


gr_TILPS = TILPStemp.groupby('uniqueid') 
output = gr_TILPS.apply(fractrips1brand) 

Кажется, такие расходы.

Почему это не O(n)?

+0

Могу ли я запустить пример? – Veedrac

ответ

2

Для функций, имеющих большую, чем линейную, временную сложность. Сортировка, например, имеет сложность O(n log n).

gr_TILPS = TILPStemp.groupby('uniqueid') 

groupbysorts the keys by default, поэтому этот вызов имеет по крайней мере O(n log n) сложности. Вы можете включить сортировку выключить с помощью

gr_TILPS = TILPStemp.groupby('uniqueid', sort=False) 

В Панды 0.15 и более ранних версий, Series.nunique(source) звонки Series.value_counts(source), которые также сортирует значения по умолчанию. Таким образом, это еще один вызов функции с сложностью O (n log n). Так как это происходит в fractrips1brand, общая сложность gr_TILPS.apply(fractrips1brand) составляет не менее O(m n log n), где m - это количество групп.

Обновление: В следующем выпуске Pandas (версия 0.16.0) Series.nuniqueshould be significantly faster.

+1

Я думаю, что у нас разные определения выпуклых. Что-то, что растет быстрее, чем линейное, не выпуклое? Выпуклый означает просто квадратичный. Предположим, что C (x) - вычислительная функция времени для x строк. По выпуклости я имею в виду только C '(x)> 0, C' '(x)> 0 – robertevansanders

+1

Извините, моя ошибка. Я думал, что вогнутый не выпуклый. Тем не менее, нет ничего необычного в более быстрой, чем линейная сложность времени. Например, сортировка - 'O (n log n)'. – unutbu

+1

Отлично, вычислительная сложность - отличная вещь, чтобы знать, как долго мой полный набор данных будет выполнен для выполнения. Почему именно O (n log n)? Думаю, мой вопрос заключается в том, что такое интуиция в отношении того, почему указанная выше функция, например, не была бы O (n)? – robertevansanders

Смежные вопросы