Может быть стоит прочитать краткое описание документации по повышению производительности , чтобы узнать, что лучше всего соответствует вашим потребностям.
Один из вариантов - перейти к numpy, используя .values
и нарезку. Не видя ваших фактических данных или варианта использования, я создал следующие синтетические данные:
data=pd.DataFrame({'column':[np.random.randint(30) for i in range(100000)],
'row':[np.random.randint(50) for i in range(100000)],
'value':[np.random.randint(100)+np.random.rand() for i in range(100000)],
'test1':[np.random.choice(['X','Y']) for i in range(100000)],
'test2':[np.random.choice(['d','e','f','g','h','i']) for i in range(100000)]})
data.head()
column row value test1 test2
0 4 30 88.367151 X e
1 7 10 92.482926 Y d
2 1 17 11.151060 Y i
3 27 10 78.707897 Y g
4 19 35 95.204207 Y h
Затем, используя %timeit
, я получил следующие результаты, используя .loc
индексацию, логическое маскирование и нарезку кусков
(Обратите внимание, в этот момент я понял, что пропустил один из поисков, так что это может повлиять на общее количество времени, но коэффициенты должны сохраняться)
%timeit data_1 = data.loc[(data['test1'] == 'X') & (data['column'] >=12) & (data['row'] > 22)]['value']
13 ms ± 538 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit data_1 = data[(data['test1'] == 'X') & (data['column'] >=12) & (data['row'] > 22)]['value']
13.1 ms ± 233 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Теперь эта следующая часть содержит некоторые накладные расходы на преобразование кадра данных в пустой массив. Если вы конвертируете его один раз, а затем выполняете несколько поисков, тогда это будет быстрее. Но если нет, то вам, вероятно, понадобится больше времени для одного преобразования / среза
Без учета времени конвертации:
d1=data.values
%timeit d1[(d1[:,3]=='X')&(d1[:,0]>=12)&(d1[:,1]>22)][:,2]
8.37 ms ± 161 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Приблизительно 30% улучшения
Со временем конвертации:
%timeit d1=data.values;d1[(d1[:,3]=='X')&(d1[:,0]>=12)&(d1[:,1]>22)][:,2]
20.6 ms ± 624 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Приблизительно на 50% хуже