Это бенчмарк из 5 библиотек:
- PostgreSQL
- SQLite
- DuckDB
- Pandas
- SQLAlchemy
psycopg2
sqlite3
duckdb
pandas
sqlalchemy
- Python 3
- Датасеты, находящиеся по ссылке
- Все файлы с расширением .py из этого репозитория, а также конфиг .json
- CSV-файлы должны находиться по пути
./DBases/file.csvот рабочей директории. - SQLite будет жаловаться на датасеты, говоря, что в них есть повторяющиеся столбцы. Для этого придётся убрать(или редактировать название) последний столбец Airport_fee
- Для Postgres и SQLAlchemy понадобится сервер localhost с настройками user="postgres",password="password",host="127.0.0.1",port="5432"
- При желании можно изменить данные, описанные в пунктах 1 и 3, но тогда нужно обязательно внести изменения в config.json
Не уверен, что стоит писать об этом, потому что дело, скорее всего, в конфигурации моей системы, но были проблемы с загрузкой большого датасета(2 Гб), оперативная память просто забивалась на все 16 Гб и происходил SIGKILL. Не знаю, в чём проблема, такого быть не должно. Проблему решил разбиением датасета на чанки, которые не забивают оперативную память до талого.
Плюсы:
✅ Хороша своей простотой и лаконичностью
✅ Библиотека, позволяющая работать с PostgreSQL
Из минусов:
❌ Вторая по медленности после SQLite(но наравне с SQLAlchemy).
❌ Первые шаги в ней делать очень сложно. Как человек, который никогда не пользовался PgAdmin4 и не создавал localhost`ы, хочу заявить, что настрадался с настройкой сервера для подключения. В этом её минус по сравнению с другими библиотеками, в которых не нужен пароль, адрес и прочая ересь.
❌ На мой взгляд, эта СУБД потихоньку изживает себя, но для новичков, изучающих основы SQL – самое то.
Была проблема, аналогичная с psycopg2(С загрузкой большого датасета). Решил так же разбиением на чанки. Кстати, у pandas была аналогичная проблема, но, благодаря тому, что там используются объекты питона, а не sql-схемы, проблему удалось быстро решить.
Плюсы
✅ Встроенная в питон библиотека, что является очень удобным. Фаворит большинства, когда речь заходит о работе с БД в Python.
✅ Также прост, как и psycopg2 в плане написания запросов, но нет проблем с подключением к БД и настройкой, что делает эту библиотеку маленькой полевой машинкой для истребления БД. Если в рабочей папке не найден .db файл, то она сама его создаст, всё гениальное – просто.
✅ Есть встроенный движок для метода to_sql. В случае с psycopg 2, его пришлось импортировать из SQL_Alchemy..
Из минусов:
❌ Самая медленная из всех.
❌ Всего 5 типов данных, что не даёт адекватно работать с данными по типу timestamp.
❌ Также при преобразовании dataframe в sql-таблицу методом .to_sql возникла проблема с различием столбцов Airport_fee и airport_fee. SQLite думает, что это одно и то же.
Используется ORM(когда вместо привычных запросов в виде строки мы обращаемся к таблицам и запросам, как к питоновским объектам). Также стоит отметить, что подсчёт времени не совсем честный по отношению к другим библиотекам, потому что pandas умеет кэшировать. В идеале стоит запустить каждую библиотеку на 1 прогон и посмотреть, что они выдадут.
Плюсы
✅ Удобен созданием .db файла. Только тут даже не надо закидывать всё в SQL, как в случае с SQLite, просто работаешь с датафреймом.
✅ Имеет в себе кучу удобных методов, помогающих работать с другими библиотеками, без него было бы очень тяжко, в этом деле – фаворит.
✅ Второй по скорости из 5 библиотек. Причём утирает нос SQLite, SQLAlchemy и Postgres в несколько раз.
Из минусов:
❌ No-SQL библиотека, что для некоторых является плюсом, но я кринжанул с этого.
Так же, как и pandas, кэширует запросы, поэтому история со временем аналогична. Но в целом показывает себя очень хорошо.
Плюсы
✅ Самая быстрая из всех библиотек. Показала какие-то заоблачные показатели, что на малом, что на большом датасете.
✅ Легко начать работать, нет мороки с подключением к серверам и импорту csv файла. Полностью самостоятельная либа, к которой даже не пришлось подключать pandas.
✅ Эта библиотека сочетает в себе плюсы psycopg2 и sqlite, но при этом лишена их недостатка – медленной работы.
✅ Умеет кэшировать
Из минусов:
❌ На первый взгляд, мало информации в интернете о том, что этотакое и как с этим работать. В целом, так и есть. Пользователи интернета не особо постят обзоры на эту либу, так как она относительно свежая. Но все проблемы уходят, если откопать официальную документацию библиотеки. Там тебя за ручку проведут, поэтому минусов, как таковых, нет.
Ещё одна ORM библиотека. По времени схожа с psycopg2, но имеет больше перспектив, так как относительно новая.
Плюсы
✅ Можно писать как SQL, так и No-SQL expressions, причём обычные SQL запросы будут даже проще идти, но это осуждается питонистами, поэтому в данном бенчмарке используются No-SQL выражения
✅ Относительно новая библиотека, быстро набирает популярность
✅ Умеет кэшировать
Из минусов:
❌ Если использовать ORM, то получаются слишком уж большие выражения. Например, 4 запрос:
query=(select(table.c.passenger_count, extract("year", table.c.tpep_pickup_datetime),func.round(table.c.trip_distance),func.count()) #Выбрать passenger_count, year из pickup_datetime, округлённое trip_distance, count(*)
.select_from(table) #Из tiny_table
.group_by(table.c.passenger_count, extract("year", table.c.tpep_pickup_datetime),func.round(table.c.trip_distance)) #Сгруппировать по 1 и 2
.order_by(extract("year", table.c.tpep_pickup_datetime),func.count())) #Упорядочить по году и count(*)-Что за *****??
Это, конечно, можно всё убрать, сохраняя шаблонные строки и запросы, но мне это кажется запарным.
❌ Довольно медленная по сравнению с другими современными библиотеками(по скорости схожа с psycopg2)
| Library | 1 query | 2 query | 3 query | 4 query |
|---|---|---|---|---|
psycopg2 |
134 | 194 | 617 | 648 |
duckdb |
3 | 14 | 18 | 30 |
sqlite3 |
431 | 746 | 1470 | 2978 |
pandas |
21 | 35 | 399 | 424 |
sqlalchemy |
160 | 200 | 642 | 663 |
| Library | 1 query | 2 query | 3 query | 4 query |
|---|---|---|---|---|
psycopg2 |
1234 | 1537 | 5966 | 9889 |
duckdb |
18 | 100 | 131 | 220 |
sqlite3 |
4401 | 7456 | 14703 | 33241 |
pandas |
21 | 33 | 432 | 429 |
sqlalchemy |
1207 | 1630 | 6403 | 10489 |