Как получить время выполнения запроса на шифр из python?

Я пытаюсь сравнить время выполнения запроса Cypher от python, то есть время, необходимое для вычисления на neo4j-сервере (не включая время, необходимое для вывода результата). Прямо сейчас я использую следующий код:

from neo4j.v1 import 
driver = GraphDatabase.driver('bolt://localhost:7687', auth=('neo4j', '1234'))

n_repeats = 3
cypher = "MATCH (a) -[:{}*]- (b) WHERE ID(a) < ID(b) RETURN DISTINCT a, b".format(graphname + '_edges')

with driver.session() as session:
    total_time = 0
    for _ in range(n_repeats):
        with session.begin_transaction() as tx:
            start = time.time()
            tx.run(cypher)
            total_time += time.time() - start

avg_time = total_time*1000 / n_repeats
print('Average execution time:', avg_time, 'ms')

Есть ли лучший способ рассчитать время выполнения запроса шифра? Например, в postgresql есть оператор EXPLAIN ANALYZE, который также предоставляет время, необходимое для выполнения запроса SQL. В Cypher есть операторы EXPLAIN и PROFILE, но, похоже, оба не возвращают определенное время.

Я использую neo4j-драйвер для подключения к neo4j прямо сейчас, но я бы хотел перейти на другую библиотеку.

1 ответ

Решение

На самом деле, затраченное время доступно во всех результатах без профилирования. Они находятся в сводке результата, и время выполнения делится на время до тех пор, пока какой-либо поток результатов не станет доступен, и время, пока весь поток результатов не будет использован сервером.

Их можно сложить вместе, чтобы получить общее время выполнения запроса, выраженное в миллисекундах:

result = tx.run(query, params)
avail = result.summary().result_available_after
cons = result.summary().result_consumed_after
total_time = avail + cons

Драйвер Neo4j Python 1.7

from neo4j.v1 import 
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))

n_repeats = 3
cypher = "MATCH (a) -[:{}*]- (b) WHERE ID(a) < ID(b) RETURN DISTINCT a, b".format(graphname + '_edges')

with driver.session() as session:
    total_time = 0
    for _ in range(n_repeats):
        with session.begin_transaction() as tx:
            start = time.time()
            result = tx.run(cypher)
            records = list(result)  # consume the records
            tx.commit()
            total_time += time.time() - start

avg_time = total_time*1000 / n_repeats
print('Average execution time:', avg_time, 'ms')
Другие вопросы по тегам