После экспериментирования с различными типами запросов в Pandas DataFrame у меня осталось несколько вопросов.Сравнение времени поиска Pandas
Вот это настроить ...
import pandas as pd
import numpy as np
import itertools
letters = [chr(x) for x in range(ord('a'), ord('z'))]
letter_combinations = [''.join(x) for x in itertools.combinations(letters, 3)]
df1 = pd.DataFrame({
'value': np.random.normal(size=(1000000)),
'letter': np.random.choice(letter_combinations, 1000000)
})
df2 = df1.sort_values('letter')
df3 = df1.set_index('letter')
df4 = df3.sort_index()
Так df1 выглядит примерно так ...
print(df1.head(5))
>>>
letter value
0 bdh 0.253778
1 cem -1.915726
2 mru -0.434007
3 lnw -1.286693
4 fjv 0.245523
Вот код для проверки различий в производительности поиска ...
print('~~~~~~~~~~~~~~~~~NON-INDEXED LOOKUPS/UNSORTED DATASET~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%timeit df1[df1.letter == 'ben']
%timeit df1[df1.letter == 'amy']
%timeit df1[df1.letter == 'abe']
print('~~~~~~~~~~~~~~~~~NON-INDEXED LOOKUPS/SORTED DATASET~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%timeit df2[df2.letter == 'ben']
%timeit df2[df2.letter == 'amy']
%timeit df2[df2.letter == 'abe']
print('~~~~~~~~~~~~~~~~~~~~~INDEXED LOOKUPS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%timeit df3.loc['ben']
%timeit df3.loc['amy']
%timeit df3.loc['abe']
print('~~~~~~~~~~~~~~~~~~~~~SORTED INDEXED LOOKUPS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%timeit df4.loc['ben']
%timeit df4.loc['amy']
%timeit df4.loc['abe']
И результаты ...
~~~~~~~~~~~~~~~~~NON-INDEXED LOOKUPS/UNSORTED DATASET~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10 loops, best of 3: 59.7 ms per loop
10 loops, best of 3: 59.7 ms per loop
10 loops, best of 3: 59.7 ms per loop
~~~~~~~~~~~~~~~~~NON-INDEXED LOOKUPS/SORTED DATASET~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10 loops, best of 3: 192 ms per loop
10 loops, best of 3: 192 ms per loop
10 loops, best of 3: 193 ms per loop
~~~~~~~~~~~~~~~~~~~~~INDEXED LOOKUPS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The slowest run took 4.66 times longer than the fastest. This could mean that an intermediate result is being cached
10 loops, best of 3: 40.9 ms per loop
10 loops, best of 3: 41 ms per loop
10 loops, best of 3: 40.9 ms per loop
~~~~~~~~~~~~~~~~~~~~~SORTED INDEXED LOOKUPS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The slowest run took 1621.00 times longer than the fastest. This could mean that an intermediate result is being cached
1 loops, best of 3: 259 µs per loop
1000 loops, best of 3: 242 µs per loop
1000 loops, best of 3: 243 µs per loop
Вопросы ...
Это очень понятно, почему поиск по отсортированном индексе намного быстрее, бинарный поиск, чтобы получить O (журнал (п)) производительность против O (N) для полного сканирование массива. Но почему поиск по отсортированному неиндексированному столбцу
df2
SLOWER, чем поиск на несортированном неиндексированном столбцеdf1
?Что такое
The slowest run took x times longer than the fastest. This could mean that an intermediate result is being cached
. Конечно, результаты не кэшируются. Это потому, что созданный индекс ленив и не на самом деле reindexed до нужного? Это объясняет, почему это происходит только при первом вызове.loc[]
.Почему индекс не отсортирован по умолчанию? Фиксированная стоимость сортировки может быть слишком большой?
'3. Почему индекс не отсортирован по умолчанию? '- представьте, что вы установили пользовательский индекс, и он отсортирован, а не спрашивает вас ... – MaxU
1. - площадь памяти' df2' составляет ок.На 50% больше по сравнению с 'df1' – MaxU
@MaxU Причина, по которой я спрашиваю, заключается в том, что другие инструменты (DB и R. data.table) сортируются по индексу по умолчанию –