Задать вопрос
@Johnem

Как оптимизировть подобный код?

Есть код, (саму бд не прилагаю т.к. весит 666мб), его суть проста - он проходит по строчкам бд и ищет экстремумы, но вот беда, делает он это крайне медленно. Можно ли его оптимизировать? Или лучше использовать pandas (для обработки и возможно хранения записей (в таком случае велики ли будут потери в весе файла и на сколько?)) или вообще структурные массивы numpy и хранить в .npy (если такое возможно) или в каком нибуть csv. Пригодятся любые советы! Код ниже.
import sqlite3

connect = sqlite3.connect('exemple.db')
cursor = connect.cursor()
cursor.executescript("""
    CREATE TABLE IF NOT EXISTS historical_data (
        security_id TEXT,
        date_and_time TEXT,
        price REAL
    );
    CREATE TABLE IF NOT EXISTS extremes (
        security_id TEXT,
        date_and_time TEXT,
        price REAL
    );
    CREATE TABLE IF NOT EXISTS levels (
        security_id TEXT,
        price REAL,
        power TEXT
    );
    """)

security_id = "GAZP"
date_and_time = "2020-01-06 10:00"

cursor.execute("SELECT COUNT(*) FROM historical_data WHERE security_id = ? AND date_and_time LIKE ?", (security_id, f"%{date_and_time}%"))
for i in range(cursor.fetchall()[0][0]):
    cursor.execute("SELECT * FROM historical_data WHERE security_id = ? AND date_and_time LIKE ? ORDER BY date_and_time LIMIT ?, 2", (security_id, f"%{date_and_time}%", i))
    a = cursor.fetchall()
    if a[1][2] - a[0][2] == 0:
        print("EXTR!")
        print(a)
  • Вопрос задан
  • 192 просмотра
Подписаться 2 Средний 3 комментария
Решения вопроса 1
LaRN
@LaRN
Senior Developer
Можно попробовать сократить перебор если откинуть заведомо не повторяющиеся цены, например так:
SELECT price
 FROM historical_data
 WHERE security_id = ?
   AND date_and_time LIKE? 
 GROUP BY price
HAVING COUNT(price) > 1

На выходе получим цены, которые минимум дважды встречаются для бумаги и даты. А дальше зная бумагу, дату и цену можно проверить идут ли эти цены последовательно или нет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
Сильно подозреваю что один чисты sql запрос, заполняющий все сразу будет на порядки оптимальнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы