@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 просмотра
Решения вопроса 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 запрос, заполняющий все сразу будет на порядки оптимальнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы