У меня получилась функция которая работает быстрее чем pandas, так ли это?

200 просмотра
0
0 Комментариев

Задание заключается в том чтобы найти разницу значений по модулю между двумя столбцами и где она больше то и вывести. Есть файл olympics.csv, там два поля gold и gold1. Находишь разницу и выводишь

И вывел время, делал в jupyter notebook

В случае pandas сделал однострочный вариант

def func():
    return (df['Gold']-df['Gold.1']).idxmax()
 
CPU times: user 4.56 ms, sys: 136 µs, total: 4.7 ms
Wall time: 4.09 ms

И сделал тоже самое только через цикл

def func1( arr, arr1 ):
    sum = 0
    ind = 0
    t = 0
    for i,v in zip(arr, arr1) :
        if abs(i - v) > sum :
            sum = i
            ind = t
        t += 1
    return df.index[ind]
 
CPU times: user 263 µs, sys: 63 µs, total: 326 µs
Wall time: 333 µs

Это в 14 раз быстрее, хотя гениального в коде у меня ничего нету

Правильно ли я использую pandas или он медленный, или же он медленный только для этого случая?)


Добавить комментарий

1 Ответы

Python Опубликовано 18.12.2018
0

Попробуйте увеличить ваш DataFrame в 1000 — 100000 раз и повторите ваш тест.

резервная копия оригинального DF:

sav = df.copy()

увеличиваем в 10.000 раз:

df = pd.concat([df] * 10**4, ignore_index=True)

здесь повтор ваших тестов…

Пример:

def func():
    return (df.a - df.b).abs().idxmax()
 
# func1( arr, arr1 ) - я взял из вашего кода без изменений

Тестовый DataFrame:

In [29]: np.random.seed(0)
 
In [30]: df = pd.DataFrame(np.random.rand(30,2), columns=['a','b'])
 
In [31]: df
Out[31]:
           a         b
0   0.548814  0.715189
1   0.602763  0.544883
2   0.423655  0.645894
3   0.437587  0.891773
4   0.963663  0.383442
..       ...       ...
25  0.570197  0.438602
26  0.988374  0.102045
27  0.208877  0.161310
28  0.653108  0.253292
29  0.466311  0.244426
 
[30 rows x 2 columns]
 
In [32]: df.shape
Out[32]: (30, 2)

Timing:

In [32]: df.shape
Out[32]: (30, 2)
 
In [33]: %timeit func()
265 µs ± 2.15 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
 
In [34]: %timeit func1(df.a, df.b)
53.5 µs ± 161 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

увеличим DF в 10.000 раз:

In [35]: df = pd.concat([df] * 10**4, ignore_index=True)
 
In [36]: df.shape
Out[36]: (300000, 2)
 
In [37]: %timeit func()
3.65 ms ± 6.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
 
In [38]: %timeit func1(df.a, df.b)
76.8 ms ± 1.33 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

увеличим еще в 10 раз:

In [39]: df = pd.concat([df] * 10, ignore_index=True)
 
In [40]: df.shape
Out[40]: (3000000, 2)
 
In [41]: %timeit func()
37 ms ± 2.21 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
 
In [42]: %timeit func1(df.a, df.b)
780 ms ± 25.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up